<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.obsidianscheduler.com/doc/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Craig</id>
	<title>Obsidian Scheduler - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.obsidianscheduler.com/doc/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Craig"/>
	<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/docs/Special:Contributions/Craig"/>
	<updated>2026-07-14T06:25:35Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.9</generator>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Release_Notes&amp;diff=4105</id>
		<title>Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Release_Notes&amp;diff=4105"/>
		<updated>2026-07-11T02:13:56Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Please review our [[Upgrading_Obsidian|Upgrade Instructions]].&lt;br /&gt;
&lt;br /&gt;
Read about our [[Planned_Releases|Planned Releases]].&lt;br /&gt;
&lt;br /&gt;
Looking for old release notes? See [[Release_Notes_-_Older_Releases|Release Notes - Older Releases]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toclimit-2&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obsidian 7.0.0 ==&lt;br /&gt;
&lt;br /&gt;
Released July 2026&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;OAuth 2.0 / OIDC Single Sign-On&#039;&#039;&#039; — Obsidian now supports OAuth 2.0 / OIDC SSO authentication via [[Authenticator#OAuthAuthenticator_(OIDC_SSO)|OAuthAuthenticator]]. Configure any OIDC-compliant identity provider (Keycloak, Microsoft Entra ID, Okta, Auth0, or Generic OIDC) as the login provider. See [[Advanced_Configuration#OAuth_/_OIDC_Authentication_Properties|OAuth/OIDC Authentication Properties]] for full configuration details.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Bearer JWT authentication for the REST API&#039;&#039;&#039; — REST clients can now authenticate using a signed JWT access token in the &#039;&#039;Authorization: Bearer&#039;&#039; header. See [[Advanced_Configuration#OAuth_/_OIDC_Authentication_Properties|OAuth/OIDC Authentication Properties]] for configuration.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Embedded Tomcat quick start&#039;&#039;&#039; — Jetty quick-start pack removed; evaluation and local runs now use Apache Tomcat 10.1.x embedded runtime (Jakarta Servlet 5). The release zip includes &#039;&#039;&#039;h2-tomcat-quick-start.xml&#039;&#039;&#039; as a ready-to-use sample. Four installer deployment profiles are available: Obsidian WAR, Obsidian Embedded Tomcat JAR, Obsidian Standalone Admin WAR, and Obsidian Standalone Admin Embedded Tomcat JAR. See [[Installation_Guide#Deployment_options|Deployment options]] and [[Getting_Started#Starting_Obsidian_with_embedded_Tomcat|Starting embedded Tomcat]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Global parameter autocomplete and tooltips&#039;&#039;&#039; — While editing a job, typing &#039;&#039;{{&#039;&#039; in a parameter value opens suggestions for global parameter names (subject to visibility settings). On job view, hover over values containing &#039;&#039;Name&#039;&#039; to see resolved global values when your user&#039;s permissions allow. Administration screens for defining global parameters are unchanged. See [[Advanced_Configuration|Advanced Configuration]] for visibility settings.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Install-time dependency resolution&#039;&#039;&#039; — The published installer download does not embed public open-source JARs. Libraries are fetched (or read from a pre-staged cache) when you run the installer. See [[Installation_Guide#Offline_or_restricted-network_install|Offline install]] for air-gapped preparation steps.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Installer upgrade (IzPack 5)&#039;&#039;&#039; — Obsidian 7.0.0 ships an IzPack 5-based installer. GUI and headless installs behave as in Obsidian 6 for standard flows. Customers with saved Obsidian 6 automated install XML must run the migrate helper included in the download before headless install. See [[Upgrading_Obsidian#Migrating_saved_automated_install_XML_.28Obsidian_6_.E2.86.92_7.29|Upgrading Obsidian]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Modular Groovy and Flexmark libraries&#039;&#039;&#039; — Obsidian no longer ships &#039;&#039;&#039;apache-groovy-all-4.0.24.jar&#039;&#039;&#039; or &#039;&#039;&#039;flexmark-util-0.62.2.jar&#039;&#039;&#039; uber archives. Scripting and UI documentation rendering use the modular JAR sets documented in [[Advanced_Configuration#Dependent_Libraries|Dependent Libraries]].&lt;br /&gt;
&lt;br /&gt;
=== Removals ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Remember Me login option removed&#039;&#039;&#039; — The Remember Me checkbox and associated session-cookie mechanism have been removed. The &#039;&#039;USER_COOKIE&#039;&#039; table and &#039;&#039;allowRememberMe&#039;&#039; system parameter are removed automatically during the upgrade to 7.0.0; no operator action is required.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;User logout&#039;&#039;&#039; - Fixed an issue where users were not fully logged out in certain session states.&lt;br /&gt;
* &#039;&#039;&#039;Job edit screen accessible to users with no roles&#039;&#039;&#039; — Users with no assigned roles could previously access the job edit screen but not make changes; this has been fixed.&lt;br /&gt;
* &#039;&#039;&#039;Firefox UI icons&#039;&#039;&#039; — Fixed icons not rendering correctly in Firefox.&lt;br /&gt;
* Jakarta emails sent with both text and HTML would drop HTML portion; this has been fixed.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.4.0 ==&lt;br /&gt;
Released December 2025&lt;br /&gt;
&lt;br /&gt;
=== Enhancements === &lt;br /&gt;
* New [[Built-in_Jobs#Obsidian_Execution_Statistics_Job|Execution Statistics Job]] and built in [[Admin_Job_Stats|UI]] and [[Embedded_API#List_Stats|Embedded API]] and [[REST_Endpoints#GET_a_list_of_job_execution_statistics|REST API]]&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Fixed issue preventing [[Admin_Jobs#Deleting|job deletion]] when resubmissions of failed executions existed. Bug existed in UI and APIs.&lt;br /&gt;
* Fixed UI styling issue for [[Admin_Jobs#Deleting|job deletion]] where checkbox label did not appear.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.3 ==&lt;br /&gt;
Released November 2025&lt;br /&gt;
&lt;br /&gt;
=== Enhancements === &lt;br /&gt;
* [https://web.obsidianscheduler.com/obsidianapi/com/carfey/suite/security/LdapAuthenticator.html LDAPAuthenticator] supports configurable check user active override - com.carfey.suite.security.LdapAuthenticator.checkActiveAttribute&lt;br /&gt;
* [https://web.obsidianscheduler.com/obsidianapi/com/carfey/suite/security/LdapAuthenticator.html#isUserActive(javax.naming.directory.DirContext,java.lang.String) LDAPAuthenticator.isUserActive(DirContext,String)] visibility increased to protected to allow for functionality override in subclasses.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Correct LdapAuthenticator case with delimited configuration where active check wasn&#039;t applied.&lt;br /&gt;
* [https://web.obsidianscheduler.com/obsidianapi/com/carfey/suite/security/LdapAuthenticator.html#isUserActive(javax.naming.directory.DirContext,java.lang.String) LDAPAuthenticator.isUserActive(DirContext,String)] javadoc added for isUserActive fully detailing the implementation.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.2 ==&lt;br /&gt;
Released October 2025&lt;br /&gt;
&lt;br /&gt;
=== Enhancements === &lt;br /&gt;
* Notification failures now trigger Dispatch category Error level event on first failure. For use in log alerts and Event Hooks.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Notification failures no longer log on every failure reducing chatty failure logs.&lt;br /&gt;
* No-arg constructors added to multiple JSON serializable candidate POJOs missing them. Addresses GSON&#039;s workaround use of sun.misc.Unsafe.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.1 ==&lt;br /&gt;
Released August 2025&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Fix failure response codes on [[REST_Endpoints#GET_health_details_on_an_existing_scheduling_host|REST health endpoint]]&lt;br /&gt;
* Fix automatic upgrade issue from 6.1.0 to any of 6.2.0, 6.2.1, 6.3.0&lt;br /&gt;
* Fix auth issue when [[Admin_User_Management#Multi-Factor_Authentication_.28MFA.29|MFA]] is enabled that allows REST access when account has been locked out due to MFA not being setup.  [[Contact_the_Obsidian_Scheduler_Team|Contact us]] if you need workaround details for earlier versions.&lt;br /&gt;
* Fix native auth issue that allows REST access when account has been flagged as inactive.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.0 ==&lt;br /&gt;
Released July 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Cron day of month expansion for [[Cron#Special_Character_Usage|day of week proximity]] using [[Cron#Examples|~]]&lt;br /&gt;
* Annotation based job and chain configuration [[Initializing_and_Restoring#Annotation_Initialization|initialization]]&lt;br /&gt;
* Health endpoint with details for Job Queuer and Job Spawner - [[REST_Endpoints#GET_health_details_on_an_existing_scheduling_host|REST API]] or Embedded API [https://web.obsidianscheduler.com/obsidianapi/com/carfey/ops/api/embedded/HostManager.html#getHealth(java.lang.String) by hostname] or [https://web.obsidianscheduler.com/obsidianapi/com/carfey/ops/api/embedded/HostManager.html#getHealth(long) by host id]&lt;br /&gt;
* JDBC URL construction from parts [[Advanced_Configuration#Database_Properties|host/port/databaseName/dbType/oracleSid]]&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.2.1 ==&lt;br /&gt;
Released June 2025&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Certain recoveries greater than 24 hours using new day of month proximity patterns introduced in 6.2.0 would result in no jobs spawning.&lt;br /&gt;
* Migrations targeting 6.0.0 and greater that start earlier than 5.0.0 skip the 5.0.0 migration. Migrating to any 5.x version first and then to 6.0.0 or later works around this issue.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.2.0 ==&lt;br /&gt;
Released May 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Cron day of month expansion for [[Cron#Special_Character_Usage|day of week proximity]] using [[Cron#Examples|&amp;lt; &amp;gt; ≥ ≤]]&lt;br /&gt;
* Cron day of month expansion for [[Cron#Special_Character_Usage|weekday proximity]] using [[Cron#Examples|&amp;lt; &amp;gt; ≥ ≤]]&lt;br /&gt;
* [[Admin_Global_Parameters#Using_Global_Parameters_in_Jobs|Global Parameters]] reference in job edit page support mouseover/title display of actual value when permissions allow&lt;br /&gt;
* Host time displayed in [[Admin_Host_Status|hosts status]] in UI&lt;br /&gt;
* [[Admin_Job_Runtime_Preview|Runtime Preview]] optimizations for large date ranges in both UI and APIs.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Combination of table prefix, sorting by clob column and Oracle metadata load failure no longer results in sql error. This occurred in the UI when viewing raw job history results and in API calls for job runtime results.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.1.1 ==&lt;br /&gt;
Released March 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Authenticator#Implementation_of_a_Custom_Authenticator|Authenticator]] supports optional &amp;lt;code&amp;gt;authenticateREST()&amp;lt;/code&amp;gt; method.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication REST logins do not apply &#039;last login&#039; timestamps. Avoids noisy error that was appearing in logs.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.1.0 ==&lt;br /&gt;
Released March 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication now disables users after 4 invalid login attempts, either password or MFA code if applicable. Invalid attempts threshold is configurable.&lt;br /&gt;
* Native authentication last login datetime displayed on list user screen.&lt;br /&gt;
* Stronger licensing controls. Site and hardware licenses as of this version must be regenerated by Carfey Software and every 2 years. Contact us at licensing [[Image:atSymbol.png]] obsidianscheduler.com.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication password complexity pattern properly created and no longer overwritten on restart.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.0.1 ==&lt;br /&gt;
Released February 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Built-in_Jobs#File_Archive_Job|File Archive Job]] and [[Built-in_Jobs#File_Scanner_Job|File Scanner Job]] both now support min/max file sizes and minimum age.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication user updates now support long passwords.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.0.0 ==&lt;br /&gt;
Released December 27, 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Jakarta Servlet 5.0&lt;br /&gt;
** Servlet container for Web Admin must support Jakarta Servlet 5.0 (e.g. Tomcat 10, Jetty 11)&lt;br /&gt;
* [[Micronaut_Integration|Micronaut]] integration support&lt;br /&gt;
* [[Advanced_Configuration#Dependent_Libraries|Groovy 4]] support&lt;br /&gt;
* [[Advanced_Configuration#Properties.2FYaml_File|Yaml]] configuration support&amp;lt;ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are using automated installer files from previous releases, you will need to add an additional configuration item to choose between yaml and properties formats in UserInputPanel.0.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;com.izforge.izpack.panels.UserInputPanel id=&amp;quot;UserInputPanel.0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;userInput&amp;gt;&lt;br /&gt;
......snip......&lt;br /&gt;
            &amp;lt;entry key=&amp;quot;config.format&amp;quot; value=&amp;quot;yaml&amp;quot; /&amp;gt;&lt;br /&gt;
OR&lt;br /&gt;
            &amp;lt;entry key=&amp;quot;config.format&amp;quot; value=&amp;quot;properties&amp;quot; /&amp;gt;&lt;br /&gt;
......snip......&lt;br /&gt;
        &amp;lt;/userInput&amp;gt;&lt;br /&gt;
    &amp;lt;/com.izforge.izpack.panels.UserInputPanel&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Native authentication supports customizable [[Admin_Login#Password_Complexity|password complexity]] requirements&lt;br /&gt;
* XML support deprecated across the product including XML UI downloads, XML runner configurations and XML license leases.&lt;br /&gt;
** &#039;&#039;&#039;Starting January 1st 2027, XML license lease requests will stop being processed. All Obsidian instances running using internet-verified licenses (including licence key proxies) will be required to use release 6.0.0 or later as of January 1st 2027.&#039;&#039;&#039;&lt;br /&gt;
** Above noted XML support will be removed in the first Obsidian version released in 2027.&lt;br /&gt;
* License leases use JSON payloads.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.5.1 ==&lt;br /&gt;
Released December 16, 2024&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Admin only (no scheduler) UI no longer generates event hook errors while running nor during shutdown&lt;br /&gt;
* Quick start installer file no longer generates errors during installation&lt;br /&gt;
* A few small web UI enhancements&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.5.0 ==&lt;br /&gt;
Released October 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Event Hooks management available in [[Admin_Host_Status#Event_Hook_Status|UI]], [[Embedded_API#Event_Hook_Resume_or_Pause|Embedded API]] and [[REST_Endpoints#POST_event_hook_pause_or_resume|REST API]].&lt;br /&gt;
* [[Installation_Guide#Additional_configuration_items|Installer]] supports custom add on configurations    &#039;&#039;&#039;Potential breaking change to automated installer files.&#039;&#039;&#039; &amp;lt;ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are using automated installer files from previous releases, you will need to add a new section of xml as of Obsidian 5.5.0 to handle a new UserInputPanel. Immediately after the UserInputPanel.17 closing brace, add the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;com.izforge.izpack.panels.UserInputPanel id=&amp;quot;UserInputPanel.18&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;userInput&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.1&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.2&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.3&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.4&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.5&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.6&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.7&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.8&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.9&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.10&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.11&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.12&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.13&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.14&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.15&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.16&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.17&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.18&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.19&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.20&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.1&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.2&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.3&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.4&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.5&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.6&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.7&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.8&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.9&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.11&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.10&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.12&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.13&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.14&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.15&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.16&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.17&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.18&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.19&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.20&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/userInput&amp;gt;&lt;br /&gt;
&amp;lt;/com.izforge.izpack.panels.UserInputPanel&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Certain Cron expressions that fail to generate text descriptions no longer impact scheduling.&lt;br /&gt;
* Text database columns were previously restricted to maximum length of MySQL implementation. Corrected to validate length via DB implementation.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.4.0 ==&lt;br /&gt;
Released June 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Event Hooks available in [[Embedded_API#List_Event_Hooks|Embedded API]] and [[REST_Endpoints#GET_event_hooks|REST API]].&lt;br /&gt;
* [[Advanced_Configuration#Dependent_Libraries|GSON library]] upgrade to support Java 21&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Oracle identifier no longer too long when using prefixes.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.3.0 ==&lt;br /&gt;
Released March 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* New [[Admin_Host_Status#Event_Hook_Status| Event Hooks Status]] available in the UI.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Some improvements throughout the [[Admin_Web_Application_Guide|Admin Web Application]] for autofocus of fields.&lt;br /&gt;
* Additional classes and interfaces added to [https://web.obsidianscheduler.com/obsidianapi/ javadoc].&lt;br /&gt;
* Some cleanup in [https://web.obsidianscheduler.com/obsidianapi/ javadoc] documenation.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.2.1 == &lt;br /&gt;
Released January 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Built-in_Jobs#Maintenance_Jobs|Maintenance Jobs]] are now scheduled by default in new installations. Can be disabled via [[Advanced_Configuration#Miscellaneous_Properties|Configuration]] property.&lt;br /&gt;
* New [[Event_Hooks#Standard_Output.2FError_Streams_Event_Hook | Standard Output/Error Streams Event Hook]].&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Schedule descriptions are now updated after edits are applied in all UI screens and APIs.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.2.0 ==&lt;br /&gt;
Released December 2023&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Cron]] &amp;amp; [[Cron#Recurrence|Recur]] patterns along with any use of [[Admin_Schedule_Aliases|Schedule Aliases]] now support plain language description of the patterns throughout the [[Admin_Web_Application_Guide|UI]], visible while hovering patterns, and in [[REST_Endpoints|REST]] and [[Embedded_API|Embedded]] API responses.&lt;br /&gt;
* All screens supporting UI exports now support JSON ([[Admin_Job_Activity#Exporting_Results|Job Activity]], [[Admin_Jobs#Exporting_Results|Jobs]], [[Admin_Job_Runtime_Preview#Exporting_Results|Runtime Previews]], [[Admin_Job_Chains#Job_Chain_Listing|Job Chains]], [[Admin_Logs#Exporting_Results|Logs]], [[Admin_Notifications#Exporting_Results|Sent Notifications]], [[Admin_User_Management#Exporting_Results|Users]], [[Admin_Custom_Calendars#Calendar_Listing|Calendars]])&lt;br /&gt;
* All screens supporting UI exports and search criteria and/or inline filters now include any specified search criteria and filter text in Excel, XML and JSON downloads ([[Admin_Job_Activity#Exporting_Results|Job Activity]], [[Admin_Jobs#Exporting_Results|Jobs]], [[Admin_Job_Runtime_Preview#Exporting_Results|Runtime Previews]], [[Admin_Job_Chains#Job_Chain_Listing|Job Chains]], [[Admin_Logs#Exporting_Results|Logs]], [[Admin_Notifications#Exporting_Results|Sent Notifications]], [[Admin_User_Management#Exporting_Results|Users]])&lt;br /&gt;
* Support for [[Installation_Guide#Choosing_Email_Support|Jakarta EE mail]] &#039;&#039;&#039;Potential breaking change to automated installer files.&#039;&#039;&#039; &amp;lt;ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are using automated installer files from previous releases and had email configured, you will need to add a new section of xml as of Obsidian 5.2.0 to handle a new UserInputPanel. Immediately after the UserInputPanel.16 closing brace, add the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;com.izforge.izpack.panels.UserInputPanel id=&amp;quot;UserInputPanel.17&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;userInput&amp;gt;&lt;br /&gt;
        &amp;lt;entry key=&amp;quot;mail.type.selection&amp;quot; value=&amp;quot;javax&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/userInput&amp;gt;&lt;br /&gt;
&amp;lt;/com.izforge.izpack.panels.UserInputPanel&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
* New [[Event_Hooks#REST_Endpoint_Event_Hook|REST Endpoint Event Hook]]&lt;br /&gt;
* [[Key_Server_Proxy|Key Server proxy]] artifact obtained via web download during installation&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Time picker buttons (hour, minute, AM/PM) in [[Admin_Job_Activity#Filtering|Job Activity filtering]] no longer change other elements of the selected time.&lt;br /&gt;
* Cron pattern with [[Cron#Special_Character_Usage|LW]] and any other non-L value in day position no longer also incorrectly evaluates to last day.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.1.1 ==&lt;br /&gt;
Released June 2023&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* [[Authenticator|Native authentication]] no longer fails when user deletes are attempted from the UI.&lt;br /&gt;
* Built in maintenance job [[Built-in_Jobs#Job_History_Cleanup_Job|Job History Cleanup]] no longer leaves deletion candidate CHAIN SKIPPED records in the JOB_HISTORY table in rare circumstances.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.1.0 ==&lt;br /&gt;
Released April 2023&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Admin_Schedule_Aliases#Schedule_Alias_Fragments|Schedule Aliases]] now support fragments for configuration-time substitutions.&lt;br /&gt;
* New convenience job [[Built-in_Jobs#Database_File_Export_Job|Database File Export Job]] for generating basic file extracts from database queries.&lt;br /&gt;
* New convenience job [[Built-in_Jobs#REST_Invocation_Job|REST Invocation Job]] for making simple REST calls and storing results.&lt;br /&gt;
* Performance improvements in job failure handling.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.4 == &lt;br /&gt;
Released February 2022&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.17.1 as fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.17.1 RCE vulnerability] where attackers can modify log4j configuration.&lt;br /&gt;
* Restore missing default log4j2 configuration in installation artifacts.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.3 == &lt;br /&gt;
Released December 2021&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.17.0 as fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.17.0 DOS vulnerability]&lt;br /&gt;
* Fix native login issue showing as inactive on some databases.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.2 == &lt;br /&gt;
Released December 2021&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.16.0 as permanent fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.16.0 RCE vulnerability]&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.1 == &lt;br /&gt;
Released December 2021&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.15.0 as fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.15.0 RCE vulnerability]&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
* Fix sporadic native login issue on some databases.&lt;br /&gt;
* Formatting fix in quick installer file&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.0 == &lt;br /&gt;
Released August 2021.&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Java 11 (minimum Java version)&lt;br /&gt;
* [[Admin_Schedule_Aliases|Schedule Aliases]] including support in [[REST_Endpoints#Schedule_Alias_Endpoints|REST API]] and [[Embedded_API#ScheduleAliasManager_API|Embedded API]]&lt;br /&gt;
* [[Admin_User_Management#Multi-Factor_Authentication_.28MFA.29|MFA Support]] for UI logins&lt;br /&gt;
* New [[Admin_User_Management#User_Rights|Author and Operator]] roles&lt;br /&gt;
* Convention-based role permissions by [[Admin_User_Management#Job_Folder_Rights|root job folder]] for Write, Author and Operator.&amp;lt;ref&amp;gt;&lt;br /&gt;
There is a possibility of a breaking change to Embedded or REST API use due to the need to change the [[Embedded_API#Enumerations|User Role enumeration]] from a Java enum to an enum-style class to support this feature. Bringing in the upgraded Obsidian library and compiling should reveal any such broken use of these enumerations. Needed changes should be minor and self-explanatory.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Bundled Jetty 10.0.2&lt;br /&gt;
* Legacy Embedded API (from Obsidian 1.5) dropped&lt;br /&gt;
* Signal handler disabled by default. Enabled only via [[Advanced_Configuration#Miscellaneous_Properties|configuration]].&lt;br /&gt;
* Many [[Advanced_Configuration#Dependent_Libraries|library upgrades]].&lt;br /&gt;
* UI javascript library updates.&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Planned_Releases&amp;diff=4104</id>
		<title>Planned Releases</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Planned_Releases&amp;diff=4104"/>
		<updated>2026-07-10T17:52:34Z</updated>

		<summary type="html">&lt;p&gt;Craig: /* Upcoming Features */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Upcoming Features ==&lt;br /&gt;
* Event Hooks can be registered via the UI and APIs.&lt;br /&gt;
* Installer enhancements&lt;br /&gt;
* ConfigValidatingJob to support warnings&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Release_Notes&amp;diff=4103</id>
		<title>Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Release_Notes&amp;diff=4103"/>
		<updated>2026-07-10T17:51:50Z</updated>

		<summary type="html">&lt;p&gt;Craig: /* Features / Enhancements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Please review our [[Upgrading_Obsidian|Upgrade Instructions]].&lt;br /&gt;
&lt;br /&gt;
Read about our [[Planned_Releases|Planned Releases]].&lt;br /&gt;
&lt;br /&gt;
Looking for old release notes? See [[Release_Notes_-_Older_Releases|Release Notes - Older Releases]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toclimit-2&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obsidian 7.0.0 ==&lt;br /&gt;
&lt;br /&gt;
Released July 2026&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;OAuth 2.0 / OIDC Single Sign-On&#039;&#039;&#039; — Obsidian now supports OAuth 2.0 / OIDC SSO authentication via [[Authenticator#OAuthAuthenticator_(OIDC_SSO)|OAuthAuthenticator]]. Configure any OIDC-compliant identity provider (Keycloak, Microsoft Entra ID, Okta, Auth0, or Generic OIDC) as the login provider. See [[Advanced_Configuration#OAuth_/_OIDC_Authentication_Properties|OAuth/OIDC Authentication Properties]] for full configuration details.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Bearer JWT authentication for the REST API&#039;&#039;&#039; — REST clients can now authenticate using a signed JWT access token in the &#039;&#039;Authorization: Bearer&#039;&#039; header. See [[Advanced_Configuration#OAuth_/_OIDC_Authentication_Properties|OAuth/OIDC Authentication Properties]] for configuration.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Embedded Tomcat quick start&#039;&#039;&#039; — Jetty quick-start pack removed; evaluation and local runs now use Apache Tomcat 10.1.x embedded runtime (Jakarta Servlet 5). The release zip includes &#039;&#039;&#039;h2-tomcat-quick-start.xml&#039;&#039;&#039; as a ready-to-use sample. Four installer deployment profiles are available: Obsidian WAR, Obsidian Embedded Tomcat JAR, Obsidian Standalone Admin WAR, and Obsidian Standalone Admin Embedded Tomcat JAR. See [[Installation_Guide#Deployment_options|Deployment options]] and [[Getting_Started#Starting_Obsidian_with_embedded_Tomcat|Starting embedded Tomcat]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Global parameter autocomplete and tooltips&#039;&#039;&#039; — While editing a job, typing &#039;&#039;{{&#039;&#039; in a parameter value opens suggestions for global parameter names (subject to visibility settings). On job view, hover over values containing &#039;&#039;Name&#039;&#039; to see resolved global values when your user&#039;s permissions allow. Administration screens for defining global parameters are unchanged. See [[Advanced_Configuration|Advanced Configuration]] for visibility settings.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Install-time dependency resolution&#039;&#039;&#039; — The published installer download does not embed public open-source JARs. Libraries are fetched (or read from a pre-staged cache) when you run the installer. See [[Installation_Guide#Offline_or_restricted-network_install|Offline install]] for air-gapped preparation steps.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Installer upgrade (IzPack 5)&#039;&#039;&#039; — Obsidian 7.0.0 ships an IzPack 5-based installer. GUI and headless installs behave as in Obsidian 6 for standard flows. Customers with saved Obsidian 6 automated install XML must run the migrate helper included in the download before headless install. See [[Upgrading_Obsidian#Migrating_saved_automated_install_XML_.28Obsidian_6_.E2.86.92_7.29|Upgrading Obsidian]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Modular Groovy and Flexmark libraries&#039;&#039;&#039; — Obsidian no longer ships &#039;&#039;&#039;apache-groovy-all-4.0.24.jar&#039;&#039;&#039; or &#039;&#039;&#039;flexmark-util-0.62.2.jar&#039;&#039;&#039; uber archives. Scripting and UI documentation rendering use the modular JAR sets documented in [[Advanced_Configuration#Dependent_Libraries|Dependent Libraries]].&lt;br /&gt;
&lt;br /&gt;
=== Removals ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Remember Me login option removed&#039;&#039;&#039; — The Remember Me checkbox and associated session-cookie mechanism have been removed. The &#039;&#039;USER_COOKIE&#039;&#039; table and &#039;&#039;allowRememberMe&#039;&#039; system parameter are removed automatically during the upgrade to 7.0.0; no operator action is required.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;User logout&#039;&#039;&#039; - Fixed an issue where users were not fully logged out in certain session states.&lt;br /&gt;
* &#039;&#039;&#039;Job edit screen accessible to users with no roles&#039;&#039;&#039; — Users with no assigned roles could previously access the job edit screen but not make changes; this has been corrected.&lt;br /&gt;
* &#039;&#039;&#039;Firefox UI icons&#039;&#039;&#039; — Fixed icons not rendering correctly in Firefox.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.4.0 ==&lt;br /&gt;
Released December 2025&lt;br /&gt;
&lt;br /&gt;
=== Enhancements === &lt;br /&gt;
* New [[Built-in_Jobs#Obsidian_Execution_Statistics_Job|Execution Statistics Job]] and built in [[Admin_Job_Stats|UI]] and [[Embedded_API#List_Stats|Embedded API]] and [[REST_Endpoints#GET_a_list_of_job_execution_statistics|REST API]]&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Fixed issue preventing [[Admin_Jobs#Deleting|job deletion]] when resubmissions of failed executions existed. Bug existed in UI and APIs.&lt;br /&gt;
* Fixed UI styling issue for [[Admin_Jobs#Deleting|job deletion]] where checkbox label did not appear.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.3 ==&lt;br /&gt;
Released November 2025&lt;br /&gt;
&lt;br /&gt;
=== Enhancements === &lt;br /&gt;
* [https://web.obsidianscheduler.com/obsidianapi/com/carfey/suite/security/LdapAuthenticator.html LDAPAuthenticator] supports configurable check user active override - com.carfey.suite.security.LdapAuthenticator.checkActiveAttribute&lt;br /&gt;
* [https://web.obsidianscheduler.com/obsidianapi/com/carfey/suite/security/LdapAuthenticator.html#isUserActive(javax.naming.directory.DirContext,java.lang.String) LDAPAuthenticator.isUserActive(DirContext,String)] visibility increased to protected to allow for functionality override in subclasses.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Correct LdapAuthenticator case with delimited configuration where active check wasn&#039;t applied.&lt;br /&gt;
* [https://web.obsidianscheduler.com/obsidianapi/com/carfey/suite/security/LdapAuthenticator.html#isUserActive(javax.naming.directory.DirContext,java.lang.String) LDAPAuthenticator.isUserActive(DirContext,String)] javadoc added for isUserActive fully detailing the implementation.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.2 ==&lt;br /&gt;
Released October 2025&lt;br /&gt;
&lt;br /&gt;
=== Enhancements === &lt;br /&gt;
* Notification failures now trigger Dispatch category Error level event on first failure. For use in log alerts and Event Hooks.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Notification failures no longer log on every failure reducing chatty failure logs.&lt;br /&gt;
* No-arg constructors added to multiple JSON serializable candidate POJOs missing them. Addresses GSON&#039;s workaround use of sun.misc.Unsafe.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.1 ==&lt;br /&gt;
Released August 2025&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Fix failure response codes on [[REST_Endpoints#GET_health_details_on_an_existing_scheduling_host|REST health endpoint]]&lt;br /&gt;
* Fix automatic upgrade issue from 6.1.0 to any of 6.2.0, 6.2.1, 6.3.0&lt;br /&gt;
* Fix auth issue when [[Admin_User_Management#Multi-Factor_Authentication_.28MFA.29|MFA]] is enabled that allows REST access when account has been locked out due to MFA not being setup.  [[Contact_the_Obsidian_Scheduler_Team|Contact us]] if you need workaround details for earlier versions.&lt;br /&gt;
* Fix native auth issue that allows REST access when account has been flagged as inactive.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.0 ==&lt;br /&gt;
Released July 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Cron day of month expansion for [[Cron#Special_Character_Usage|day of week proximity]] using [[Cron#Examples|~]]&lt;br /&gt;
* Annotation based job and chain configuration [[Initializing_and_Restoring#Annotation_Initialization|initialization]]&lt;br /&gt;
* Health endpoint with details for Job Queuer and Job Spawner - [[REST_Endpoints#GET_health_details_on_an_existing_scheduling_host|REST API]] or Embedded API [https://web.obsidianscheduler.com/obsidianapi/com/carfey/ops/api/embedded/HostManager.html#getHealth(java.lang.String) by hostname] or [https://web.obsidianscheduler.com/obsidianapi/com/carfey/ops/api/embedded/HostManager.html#getHealth(long) by host id]&lt;br /&gt;
* JDBC URL construction from parts [[Advanced_Configuration#Database_Properties|host/port/databaseName/dbType/oracleSid]]&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.2.1 ==&lt;br /&gt;
Released June 2025&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Certain recoveries greater than 24 hours using new day of month proximity patterns introduced in 6.2.0 would result in no jobs spawning.&lt;br /&gt;
* Migrations targeting 6.0.0 and greater that start earlier than 5.0.0 skip the 5.0.0 migration. Migrating to any 5.x version first and then to 6.0.0 or later works around this issue.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.2.0 ==&lt;br /&gt;
Released May 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Cron day of month expansion for [[Cron#Special_Character_Usage|day of week proximity]] using [[Cron#Examples|&amp;lt; &amp;gt; ≥ ≤]]&lt;br /&gt;
* Cron day of month expansion for [[Cron#Special_Character_Usage|weekday proximity]] using [[Cron#Examples|&amp;lt; &amp;gt; ≥ ≤]]&lt;br /&gt;
* [[Admin_Global_Parameters#Using_Global_Parameters_in_Jobs|Global Parameters]] reference in job edit page support mouseover/title display of actual value when permissions allow&lt;br /&gt;
* Host time displayed in [[Admin_Host_Status|hosts status]] in UI&lt;br /&gt;
* [[Admin_Job_Runtime_Preview|Runtime Preview]] optimizations for large date ranges in both UI and APIs.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Combination of table prefix, sorting by clob column and Oracle metadata load failure no longer results in sql error. This occurred in the UI when viewing raw job history results and in API calls for job runtime results.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.1.1 ==&lt;br /&gt;
Released March 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Authenticator#Implementation_of_a_Custom_Authenticator|Authenticator]] supports optional &amp;lt;code&amp;gt;authenticateREST()&amp;lt;/code&amp;gt; method.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication REST logins do not apply &#039;last login&#039; timestamps. Avoids noisy error that was appearing in logs.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.1.0 ==&lt;br /&gt;
Released March 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication now disables users after 4 invalid login attempts, either password or MFA code if applicable. Invalid attempts threshold is configurable.&lt;br /&gt;
* Native authentication last login datetime displayed on list user screen.&lt;br /&gt;
* Stronger licensing controls. Site and hardware licenses as of this version must be regenerated by Carfey Software and every 2 years. Contact us at licensing [[Image:atSymbol.png]] obsidianscheduler.com.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication password complexity pattern properly created and no longer overwritten on restart.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.0.1 ==&lt;br /&gt;
Released February 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Built-in_Jobs#File_Archive_Job|File Archive Job]] and [[Built-in_Jobs#File_Scanner_Job|File Scanner Job]] both now support min/max file sizes and minimum age.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication user updates now support long passwords.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.0.0 ==&lt;br /&gt;
Released December 27, 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Jakarta Servlet 5.0&lt;br /&gt;
** Servlet container for Web Admin must support Jakarta Servlet 5.0 (e.g. Tomcat 10, Jetty 11)&lt;br /&gt;
* [[Micronaut_Integration|Micronaut]] integration support&lt;br /&gt;
* [[Advanced_Configuration#Dependent_Libraries|Groovy 4]] support&lt;br /&gt;
* [[Advanced_Configuration#Properties.2FYaml_File|Yaml]] configuration support&amp;lt;ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are using automated installer files from previous releases, you will need to add an additional configuration item to choose between yaml and properties formats in UserInputPanel.0.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;com.izforge.izpack.panels.UserInputPanel id=&amp;quot;UserInputPanel.0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;userInput&amp;gt;&lt;br /&gt;
......snip......&lt;br /&gt;
            &amp;lt;entry key=&amp;quot;config.format&amp;quot; value=&amp;quot;yaml&amp;quot; /&amp;gt;&lt;br /&gt;
OR&lt;br /&gt;
            &amp;lt;entry key=&amp;quot;config.format&amp;quot; value=&amp;quot;properties&amp;quot; /&amp;gt;&lt;br /&gt;
......snip......&lt;br /&gt;
        &amp;lt;/userInput&amp;gt;&lt;br /&gt;
    &amp;lt;/com.izforge.izpack.panels.UserInputPanel&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Native authentication supports customizable [[Admin_Login#Password_Complexity|password complexity]] requirements&lt;br /&gt;
* XML support deprecated across the product including XML UI downloads, XML runner configurations and XML license leases.&lt;br /&gt;
** &#039;&#039;&#039;Starting January 1st 2027, XML license lease requests will stop being processed. All Obsidian instances running using internet-verified licenses (including licence key proxies) will be required to use release 6.0.0 or later as of January 1st 2027.&#039;&#039;&#039;&lt;br /&gt;
** Above noted XML support will be removed in the first Obsidian version released in 2027.&lt;br /&gt;
* License leases use JSON payloads.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.5.1 ==&lt;br /&gt;
Released December 16, 2024&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Admin only (no scheduler) UI no longer generates event hook errors while running nor during shutdown&lt;br /&gt;
* Quick start installer file no longer generates errors during installation&lt;br /&gt;
* A few small web UI enhancements&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.5.0 ==&lt;br /&gt;
Released October 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Event Hooks management available in [[Admin_Host_Status#Event_Hook_Status|UI]], [[Embedded_API#Event_Hook_Resume_or_Pause|Embedded API]] and [[REST_Endpoints#POST_event_hook_pause_or_resume|REST API]].&lt;br /&gt;
* [[Installation_Guide#Additional_configuration_items|Installer]] supports custom add on configurations    &#039;&#039;&#039;Potential breaking change to automated installer files.&#039;&#039;&#039; &amp;lt;ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are using automated installer files from previous releases, you will need to add a new section of xml as of Obsidian 5.5.0 to handle a new UserInputPanel. Immediately after the UserInputPanel.17 closing brace, add the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;com.izforge.izpack.panels.UserInputPanel id=&amp;quot;UserInputPanel.18&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;userInput&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.1&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.2&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.3&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.4&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.5&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.6&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.7&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.8&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.9&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.10&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.11&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.12&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.13&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.14&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.15&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.16&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.17&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.18&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.19&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.20&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.1&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.2&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.3&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.4&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.5&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.6&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.7&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.8&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.9&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.11&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.10&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.12&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.13&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.14&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.15&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.16&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.17&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.18&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.19&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.20&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/userInput&amp;gt;&lt;br /&gt;
&amp;lt;/com.izforge.izpack.panels.UserInputPanel&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Certain Cron expressions that fail to generate text descriptions no longer impact scheduling.&lt;br /&gt;
* Text database columns were previously restricted to maximum length of MySQL implementation. Corrected to validate length via DB implementation.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.4.0 ==&lt;br /&gt;
Released June 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Event Hooks available in [[Embedded_API#List_Event_Hooks|Embedded API]] and [[REST_Endpoints#GET_event_hooks|REST API]].&lt;br /&gt;
* [[Advanced_Configuration#Dependent_Libraries|GSON library]] upgrade to support Java 21&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Oracle identifier no longer too long when using prefixes.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.3.0 ==&lt;br /&gt;
Released March 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* New [[Admin_Host_Status#Event_Hook_Status| Event Hooks Status]] available in the UI.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Some improvements throughout the [[Admin_Web_Application_Guide|Admin Web Application]] for autofocus of fields.&lt;br /&gt;
* Additional classes and interfaces added to [https://web.obsidianscheduler.com/obsidianapi/ javadoc].&lt;br /&gt;
* Some cleanup in [https://web.obsidianscheduler.com/obsidianapi/ javadoc] documenation.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.2.1 == &lt;br /&gt;
Released January 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Built-in_Jobs#Maintenance_Jobs|Maintenance Jobs]] are now scheduled by default in new installations. Can be disabled via [[Advanced_Configuration#Miscellaneous_Properties|Configuration]] property.&lt;br /&gt;
* New [[Event_Hooks#Standard_Output.2FError_Streams_Event_Hook | Standard Output/Error Streams Event Hook]].&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Schedule descriptions are now updated after edits are applied in all UI screens and APIs.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.2.0 ==&lt;br /&gt;
Released December 2023&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Cron]] &amp;amp; [[Cron#Recurrence|Recur]] patterns along with any use of [[Admin_Schedule_Aliases|Schedule Aliases]] now support plain language description of the patterns throughout the [[Admin_Web_Application_Guide|UI]], visible while hovering patterns, and in [[REST_Endpoints|REST]] and [[Embedded_API|Embedded]] API responses.&lt;br /&gt;
* All screens supporting UI exports now support JSON ([[Admin_Job_Activity#Exporting_Results|Job Activity]], [[Admin_Jobs#Exporting_Results|Jobs]], [[Admin_Job_Runtime_Preview#Exporting_Results|Runtime Previews]], [[Admin_Job_Chains#Job_Chain_Listing|Job Chains]], [[Admin_Logs#Exporting_Results|Logs]], [[Admin_Notifications#Exporting_Results|Sent Notifications]], [[Admin_User_Management#Exporting_Results|Users]], [[Admin_Custom_Calendars#Calendar_Listing|Calendars]])&lt;br /&gt;
* All screens supporting UI exports and search criteria and/or inline filters now include any specified search criteria and filter text in Excel, XML and JSON downloads ([[Admin_Job_Activity#Exporting_Results|Job Activity]], [[Admin_Jobs#Exporting_Results|Jobs]], [[Admin_Job_Runtime_Preview#Exporting_Results|Runtime Previews]], [[Admin_Job_Chains#Job_Chain_Listing|Job Chains]], [[Admin_Logs#Exporting_Results|Logs]], [[Admin_Notifications#Exporting_Results|Sent Notifications]], [[Admin_User_Management#Exporting_Results|Users]])&lt;br /&gt;
* Support for [[Installation_Guide#Choosing_Email_Support|Jakarta EE mail]] &#039;&#039;&#039;Potential breaking change to automated installer files.&#039;&#039;&#039; &amp;lt;ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are using automated installer files from previous releases and had email configured, you will need to add a new section of xml as of Obsidian 5.2.0 to handle a new UserInputPanel. Immediately after the UserInputPanel.16 closing brace, add the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;com.izforge.izpack.panels.UserInputPanel id=&amp;quot;UserInputPanel.17&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;userInput&amp;gt;&lt;br /&gt;
        &amp;lt;entry key=&amp;quot;mail.type.selection&amp;quot; value=&amp;quot;javax&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/userInput&amp;gt;&lt;br /&gt;
&amp;lt;/com.izforge.izpack.panels.UserInputPanel&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
* New [[Event_Hooks#REST_Endpoint_Event_Hook|REST Endpoint Event Hook]]&lt;br /&gt;
* [[Key_Server_Proxy|Key Server proxy]] artifact obtained via web download during installation&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Time picker buttons (hour, minute, AM/PM) in [[Admin_Job_Activity#Filtering|Job Activity filtering]] no longer change other elements of the selected time.&lt;br /&gt;
* Cron pattern with [[Cron#Special_Character_Usage|LW]] and any other non-L value in day position no longer also incorrectly evaluates to last day.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.1.1 ==&lt;br /&gt;
Released June 2023&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* [[Authenticator|Native authentication]] no longer fails when user deletes are attempted from the UI.&lt;br /&gt;
* Built in maintenance job [[Built-in_Jobs#Job_History_Cleanup_Job|Job History Cleanup]] no longer leaves deletion candidate CHAIN SKIPPED records in the JOB_HISTORY table in rare circumstances.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.1.0 ==&lt;br /&gt;
Released April 2023&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Admin_Schedule_Aliases#Schedule_Alias_Fragments|Schedule Aliases]] now support fragments for configuration-time substitutions.&lt;br /&gt;
* New convenience job [[Built-in_Jobs#Database_File_Export_Job|Database File Export Job]] for generating basic file extracts from database queries.&lt;br /&gt;
* New convenience job [[Built-in_Jobs#REST_Invocation_Job|REST Invocation Job]] for making simple REST calls and storing results.&lt;br /&gt;
* Performance improvements in job failure handling.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.4 == &lt;br /&gt;
Released February 2022&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.17.1 as fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.17.1 RCE vulnerability] where attackers can modify log4j configuration.&lt;br /&gt;
* Restore missing default log4j2 configuration in installation artifacts.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.3 == &lt;br /&gt;
Released December 2021&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.17.0 as fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.17.0 DOS vulnerability]&lt;br /&gt;
* Fix native login issue showing as inactive on some databases.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.2 == &lt;br /&gt;
Released December 2021&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.16.0 as permanent fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.16.0 RCE vulnerability]&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.1 == &lt;br /&gt;
Released December 2021&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.15.0 as fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.15.0 RCE vulnerability]&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
* Fix sporadic native login issue on some databases.&lt;br /&gt;
* Formatting fix in quick installer file&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.0 == &lt;br /&gt;
Released August 2021.&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Java 11 (minimum Java version)&lt;br /&gt;
* [[Admin_Schedule_Aliases|Schedule Aliases]] including support in [[REST_Endpoints#Schedule_Alias_Endpoints|REST API]] and [[Embedded_API#ScheduleAliasManager_API|Embedded API]]&lt;br /&gt;
* [[Admin_User_Management#Multi-Factor_Authentication_.28MFA.29|MFA Support]] for UI logins&lt;br /&gt;
* New [[Admin_User_Management#User_Rights|Author and Operator]] roles&lt;br /&gt;
* Convention-based role permissions by [[Admin_User_Management#Job_Folder_Rights|root job folder]] for Write, Author and Operator.&amp;lt;ref&amp;gt;&lt;br /&gt;
There is a possibility of a breaking change to Embedded or REST API use due to the need to change the [[Embedded_API#Enumerations|User Role enumeration]] from a Java enum to an enum-style class to support this feature. Bringing in the upgraded Obsidian library and compiling should reveal any such broken use of these enumerations. Needed changes should be minor and self-explanatory.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Bundled Jetty 10.0.2&lt;br /&gt;
* Legacy Embedded API (from Obsidian 1.5) dropped&lt;br /&gt;
* Signal handler disabled by default. Enabled only via [[Advanced_Configuration#Miscellaneous_Properties|configuration]].&lt;br /&gt;
* Many [[Advanced_Configuration#Dependent_Libraries|library upgrades]].&lt;br /&gt;
* UI javascript library updates.&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Release_Notes&amp;diff=4102</id>
		<title>Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Release_Notes&amp;diff=4102"/>
		<updated>2026-07-10T17:51:20Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Please review our [[Upgrading_Obsidian|Upgrade Instructions]].&lt;br /&gt;
&lt;br /&gt;
Read about our [[Planned_Releases|Planned Releases]].&lt;br /&gt;
&lt;br /&gt;
Looking for old release notes? See [[Release_Notes_-_Older_Releases|Release Notes - Older Releases]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toclimit-2&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obsidian 7.0.0 ==&lt;br /&gt;
&lt;br /&gt;
Released July 2026&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;OAuth 2.0 / OIDC Single Sign-On&#039;&#039;&#039; — Obsidian now supports OAuth 2.0 / OIDC SSO authentication via [[Authenticator#OAuthAuthenticator_(OIDC_SSO)|OAuthAuthenticator]]. Configure any OIDC-compliant identity provider (Keycloak, Microsoft Entra ID, Okta, Auth0, or Generic OIDC) as the login provider. See [[Advanced_Configuration#OAuth_/_OIDC_Authentication_Properties|OAuth/OIDC Authentication Properties]] for full configuration details.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Bearer JWT authentication for the REST API&#039;&#039;&#039; — REST clients can now authenticate using a signed JWT access token in the &#039;&#039;Authorization: Bearer&#039;&#039; header. See [[Advanced_Configuration#OAuth_/_OIDC_Authentication_Properties|OAuth/OIDC Authentication Properties]] for configuration.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Installer upgrade (IzPack 5)&#039;&#039;&#039; — Obsidian 7.0.0 ships an IzPack 5-based installer. GUI and headless installs behave as in Obsidian 6 for standard flows. Customers with saved Obsidian 6 automated install XML must run the migrate helper included in the download before headless install. See [[Upgrading_Obsidian#Migrating_saved_automated_install_XML_.28Obsidian_6_.E2.86.92_7.29|Upgrading Obsidian]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Embedded Tomcat quick start&#039;&#039;&#039; — Jetty quick-start pack removed; evaluation and local runs now use Apache Tomcat 10.1.x embedded runtime (Jakarta Servlet 5). The release zip includes &#039;&#039;&#039;h2-tomcat-quick-start.xml&#039;&#039;&#039; as a ready-to-use sample. Four installer deployment profiles are available: Obsidian WAR, Obsidian Embedded Tomcat JAR, Obsidian Standalone Admin WAR, and Obsidian Standalone Admin Embedded Tomcat JAR. See [[Installation_Guide#Deployment_options|Deployment options]] and [[Getting_Started#Starting_Obsidian_with_embedded_Tomcat|Starting embedded Tomcat]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Global parameter autocomplete and tooltips&#039;&#039;&#039; — While editing a job, typing &#039;&#039;{{&#039;&#039; in a parameter value opens suggestions for global parameter names (subject to visibility settings). On job view, hover over values containing &#039;&#039;Name&#039;&#039; to see resolved global values when your user&#039;s permissions allow. Administration screens for defining global parameters are unchanged. See [[Advanced_Configuration|Advanced Configuration]] for visibility settings.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Install-time dependency resolution&#039;&#039;&#039; — The published installer download does not embed public open-source JARs. Libraries are fetched (or read from a pre-staged cache) when you run the installer. See [[Installation_Guide#Offline_or_restricted-network_install|Offline install]] for air-gapped preparation steps.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Modular Groovy and Flexmark libraries&#039;&#039;&#039; — Obsidian no longer ships &#039;&#039;&#039;apache-groovy-all-4.0.24.jar&#039;&#039;&#039; or &#039;&#039;&#039;flexmark-util-0.62.2.jar&#039;&#039;&#039; uber archives. Scripting and UI documentation rendering use the modular JAR sets documented in [[Advanced_Configuration#Dependent_Libraries|Dependent Libraries]].&lt;br /&gt;
&lt;br /&gt;
=== Removals ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Remember Me login option removed&#039;&#039;&#039; — The Remember Me checkbox and associated session-cookie mechanism have been removed. The &#039;&#039;USER_COOKIE&#039;&#039; table and &#039;&#039;allowRememberMe&#039;&#039; system parameter are removed automatically during the upgrade to 7.0.0; no operator action is required.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;User logout&#039;&#039;&#039; - Fixed an issue where users were not fully logged out in certain session states.&lt;br /&gt;
* &#039;&#039;&#039;Job edit screen accessible to users with no roles&#039;&#039;&#039; — Users with no assigned roles could previously access the job edit screen but not make changes; this has been corrected.&lt;br /&gt;
* &#039;&#039;&#039;Firefox UI icons&#039;&#039;&#039; — Fixed icons not rendering correctly in Firefox.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.4.0 ==&lt;br /&gt;
Released December 2025&lt;br /&gt;
&lt;br /&gt;
=== Enhancements === &lt;br /&gt;
* New [[Built-in_Jobs#Obsidian_Execution_Statistics_Job|Execution Statistics Job]] and built in [[Admin_Job_Stats|UI]] and [[Embedded_API#List_Stats|Embedded API]] and [[REST_Endpoints#GET_a_list_of_job_execution_statistics|REST API]]&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Fixed issue preventing [[Admin_Jobs#Deleting|job deletion]] when resubmissions of failed executions existed. Bug existed in UI and APIs.&lt;br /&gt;
* Fixed UI styling issue for [[Admin_Jobs#Deleting|job deletion]] where checkbox label did not appear.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.3 ==&lt;br /&gt;
Released November 2025&lt;br /&gt;
&lt;br /&gt;
=== Enhancements === &lt;br /&gt;
* [https://web.obsidianscheduler.com/obsidianapi/com/carfey/suite/security/LdapAuthenticator.html LDAPAuthenticator] supports configurable check user active override - com.carfey.suite.security.LdapAuthenticator.checkActiveAttribute&lt;br /&gt;
* [https://web.obsidianscheduler.com/obsidianapi/com/carfey/suite/security/LdapAuthenticator.html#isUserActive(javax.naming.directory.DirContext,java.lang.String) LDAPAuthenticator.isUserActive(DirContext,String)] visibility increased to protected to allow for functionality override in subclasses.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Correct LdapAuthenticator case with delimited configuration where active check wasn&#039;t applied.&lt;br /&gt;
* [https://web.obsidianscheduler.com/obsidianapi/com/carfey/suite/security/LdapAuthenticator.html#isUserActive(javax.naming.directory.DirContext,java.lang.String) LDAPAuthenticator.isUserActive(DirContext,String)] javadoc added for isUserActive fully detailing the implementation.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.2 ==&lt;br /&gt;
Released October 2025&lt;br /&gt;
&lt;br /&gt;
=== Enhancements === &lt;br /&gt;
* Notification failures now trigger Dispatch category Error level event on first failure. For use in log alerts and Event Hooks.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Notification failures no longer log on every failure reducing chatty failure logs.&lt;br /&gt;
* No-arg constructors added to multiple JSON serializable candidate POJOs missing them. Addresses GSON&#039;s workaround use of sun.misc.Unsafe.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.1 ==&lt;br /&gt;
Released August 2025&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Fix failure response codes on [[REST_Endpoints#GET_health_details_on_an_existing_scheduling_host|REST health endpoint]]&lt;br /&gt;
* Fix automatic upgrade issue from 6.1.0 to any of 6.2.0, 6.2.1, 6.3.0&lt;br /&gt;
* Fix auth issue when [[Admin_User_Management#Multi-Factor_Authentication_.28MFA.29|MFA]] is enabled that allows REST access when account has been locked out due to MFA not being setup.  [[Contact_the_Obsidian_Scheduler_Team|Contact us]] if you need workaround details for earlier versions.&lt;br /&gt;
* Fix native auth issue that allows REST access when account has been flagged as inactive.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.0 ==&lt;br /&gt;
Released July 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Cron day of month expansion for [[Cron#Special_Character_Usage|day of week proximity]] using [[Cron#Examples|~]]&lt;br /&gt;
* Annotation based job and chain configuration [[Initializing_and_Restoring#Annotation_Initialization|initialization]]&lt;br /&gt;
* Health endpoint with details for Job Queuer and Job Spawner - [[REST_Endpoints#GET_health_details_on_an_existing_scheduling_host|REST API]] or Embedded API [https://web.obsidianscheduler.com/obsidianapi/com/carfey/ops/api/embedded/HostManager.html#getHealth(java.lang.String) by hostname] or [https://web.obsidianscheduler.com/obsidianapi/com/carfey/ops/api/embedded/HostManager.html#getHealth(long) by host id]&lt;br /&gt;
* JDBC URL construction from parts [[Advanced_Configuration#Database_Properties|host/port/databaseName/dbType/oracleSid]]&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.2.1 ==&lt;br /&gt;
Released June 2025&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Certain recoveries greater than 24 hours using new day of month proximity patterns introduced in 6.2.0 would result in no jobs spawning.&lt;br /&gt;
* Migrations targeting 6.0.0 and greater that start earlier than 5.0.0 skip the 5.0.0 migration. Migrating to any 5.x version first and then to 6.0.0 or later works around this issue.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.2.0 ==&lt;br /&gt;
Released May 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Cron day of month expansion for [[Cron#Special_Character_Usage|day of week proximity]] using [[Cron#Examples|&amp;lt; &amp;gt; ≥ ≤]]&lt;br /&gt;
* Cron day of month expansion for [[Cron#Special_Character_Usage|weekday proximity]] using [[Cron#Examples|&amp;lt; &amp;gt; ≥ ≤]]&lt;br /&gt;
* [[Admin_Global_Parameters#Using_Global_Parameters_in_Jobs|Global Parameters]] reference in job edit page support mouseover/title display of actual value when permissions allow&lt;br /&gt;
* Host time displayed in [[Admin_Host_Status|hosts status]] in UI&lt;br /&gt;
* [[Admin_Job_Runtime_Preview|Runtime Preview]] optimizations for large date ranges in both UI and APIs.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Combination of table prefix, sorting by clob column and Oracle metadata load failure no longer results in sql error. This occurred in the UI when viewing raw job history results and in API calls for job runtime results.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.1.1 ==&lt;br /&gt;
Released March 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Authenticator#Implementation_of_a_Custom_Authenticator|Authenticator]] supports optional &amp;lt;code&amp;gt;authenticateREST()&amp;lt;/code&amp;gt; method.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication REST logins do not apply &#039;last login&#039; timestamps. Avoids noisy error that was appearing in logs.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.1.0 ==&lt;br /&gt;
Released March 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication now disables users after 4 invalid login attempts, either password or MFA code if applicable. Invalid attempts threshold is configurable.&lt;br /&gt;
* Native authentication last login datetime displayed on list user screen.&lt;br /&gt;
* Stronger licensing controls. Site and hardware licenses as of this version must be regenerated by Carfey Software and every 2 years. Contact us at licensing [[Image:atSymbol.png]] obsidianscheduler.com.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication password complexity pattern properly created and no longer overwritten on restart.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.0.1 ==&lt;br /&gt;
Released February 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Built-in_Jobs#File_Archive_Job|File Archive Job]] and [[Built-in_Jobs#File_Scanner_Job|File Scanner Job]] both now support min/max file sizes and minimum age.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication user updates now support long passwords.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.0.0 ==&lt;br /&gt;
Released December 27, 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Jakarta Servlet 5.0&lt;br /&gt;
** Servlet container for Web Admin must support Jakarta Servlet 5.0 (e.g. Tomcat 10, Jetty 11)&lt;br /&gt;
* [[Micronaut_Integration|Micronaut]] integration support&lt;br /&gt;
* [[Advanced_Configuration#Dependent_Libraries|Groovy 4]] support&lt;br /&gt;
* [[Advanced_Configuration#Properties.2FYaml_File|Yaml]] configuration support&amp;lt;ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are using automated installer files from previous releases, you will need to add an additional configuration item to choose between yaml and properties formats in UserInputPanel.0.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;com.izforge.izpack.panels.UserInputPanel id=&amp;quot;UserInputPanel.0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;userInput&amp;gt;&lt;br /&gt;
......snip......&lt;br /&gt;
            &amp;lt;entry key=&amp;quot;config.format&amp;quot; value=&amp;quot;yaml&amp;quot; /&amp;gt;&lt;br /&gt;
OR&lt;br /&gt;
            &amp;lt;entry key=&amp;quot;config.format&amp;quot; value=&amp;quot;properties&amp;quot; /&amp;gt;&lt;br /&gt;
......snip......&lt;br /&gt;
        &amp;lt;/userInput&amp;gt;&lt;br /&gt;
    &amp;lt;/com.izforge.izpack.panels.UserInputPanel&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Native authentication supports customizable [[Admin_Login#Password_Complexity|password complexity]] requirements&lt;br /&gt;
* XML support deprecated across the product including XML UI downloads, XML runner configurations and XML license leases.&lt;br /&gt;
** &#039;&#039;&#039;Starting January 1st 2027, XML license lease requests will stop being processed. All Obsidian instances running using internet-verified licenses (including licence key proxies) will be required to use release 6.0.0 or later as of January 1st 2027.&#039;&#039;&#039;&lt;br /&gt;
** Above noted XML support will be removed in the first Obsidian version released in 2027.&lt;br /&gt;
* License leases use JSON payloads.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.5.1 ==&lt;br /&gt;
Released December 16, 2024&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Admin only (no scheduler) UI no longer generates event hook errors while running nor during shutdown&lt;br /&gt;
* Quick start installer file no longer generates errors during installation&lt;br /&gt;
* A few small web UI enhancements&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.5.0 ==&lt;br /&gt;
Released October 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Event Hooks management available in [[Admin_Host_Status#Event_Hook_Status|UI]], [[Embedded_API#Event_Hook_Resume_or_Pause|Embedded API]] and [[REST_Endpoints#POST_event_hook_pause_or_resume|REST API]].&lt;br /&gt;
* [[Installation_Guide#Additional_configuration_items|Installer]] supports custom add on configurations    &#039;&#039;&#039;Potential breaking change to automated installer files.&#039;&#039;&#039; &amp;lt;ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are using automated installer files from previous releases, you will need to add a new section of xml as of Obsidian 5.5.0 to handle a new UserInputPanel. Immediately after the UserInputPanel.17 closing brace, add the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;com.izforge.izpack.panels.UserInputPanel id=&amp;quot;UserInputPanel.18&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;userInput&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.1&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.2&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.3&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.4&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.5&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.6&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.7&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.8&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.9&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.10&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.11&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.12&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.13&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.14&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.15&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.16&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.17&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.18&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.19&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.20&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.1&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.2&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.3&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.4&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.5&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.6&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.7&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.8&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.9&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.11&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.10&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.12&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.13&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.14&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.15&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.16&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.17&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.18&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.19&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.20&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/userInput&amp;gt;&lt;br /&gt;
&amp;lt;/com.izforge.izpack.panels.UserInputPanel&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Certain Cron expressions that fail to generate text descriptions no longer impact scheduling.&lt;br /&gt;
* Text database columns were previously restricted to maximum length of MySQL implementation. Corrected to validate length via DB implementation.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.4.0 ==&lt;br /&gt;
Released June 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Event Hooks available in [[Embedded_API#List_Event_Hooks|Embedded API]] and [[REST_Endpoints#GET_event_hooks|REST API]].&lt;br /&gt;
* [[Advanced_Configuration#Dependent_Libraries|GSON library]] upgrade to support Java 21&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Oracle identifier no longer too long when using prefixes.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.3.0 ==&lt;br /&gt;
Released March 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* New [[Admin_Host_Status#Event_Hook_Status| Event Hooks Status]] available in the UI.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Some improvements throughout the [[Admin_Web_Application_Guide|Admin Web Application]] for autofocus of fields.&lt;br /&gt;
* Additional classes and interfaces added to [https://web.obsidianscheduler.com/obsidianapi/ javadoc].&lt;br /&gt;
* Some cleanup in [https://web.obsidianscheduler.com/obsidianapi/ javadoc] documenation.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.2.1 == &lt;br /&gt;
Released January 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Built-in_Jobs#Maintenance_Jobs|Maintenance Jobs]] are now scheduled by default in new installations. Can be disabled via [[Advanced_Configuration#Miscellaneous_Properties|Configuration]] property.&lt;br /&gt;
* New [[Event_Hooks#Standard_Output.2FError_Streams_Event_Hook | Standard Output/Error Streams Event Hook]].&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Schedule descriptions are now updated after edits are applied in all UI screens and APIs.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.2.0 ==&lt;br /&gt;
Released December 2023&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Cron]] &amp;amp; [[Cron#Recurrence|Recur]] patterns along with any use of [[Admin_Schedule_Aliases|Schedule Aliases]] now support plain language description of the patterns throughout the [[Admin_Web_Application_Guide|UI]], visible while hovering patterns, and in [[REST_Endpoints|REST]] and [[Embedded_API|Embedded]] API responses.&lt;br /&gt;
* All screens supporting UI exports now support JSON ([[Admin_Job_Activity#Exporting_Results|Job Activity]], [[Admin_Jobs#Exporting_Results|Jobs]], [[Admin_Job_Runtime_Preview#Exporting_Results|Runtime Previews]], [[Admin_Job_Chains#Job_Chain_Listing|Job Chains]], [[Admin_Logs#Exporting_Results|Logs]], [[Admin_Notifications#Exporting_Results|Sent Notifications]], [[Admin_User_Management#Exporting_Results|Users]], [[Admin_Custom_Calendars#Calendar_Listing|Calendars]])&lt;br /&gt;
* All screens supporting UI exports and search criteria and/or inline filters now include any specified search criteria and filter text in Excel, XML and JSON downloads ([[Admin_Job_Activity#Exporting_Results|Job Activity]], [[Admin_Jobs#Exporting_Results|Jobs]], [[Admin_Job_Runtime_Preview#Exporting_Results|Runtime Previews]], [[Admin_Job_Chains#Job_Chain_Listing|Job Chains]], [[Admin_Logs#Exporting_Results|Logs]], [[Admin_Notifications#Exporting_Results|Sent Notifications]], [[Admin_User_Management#Exporting_Results|Users]])&lt;br /&gt;
* Support for [[Installation_Guide#Choosing_Email_Support|Jakarta EE mail]] &#039;&#039;&#039;Potential breaking change to automated installer files.&#039;&#039;&#039; &amp;lt;ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are using automated installer files from previous releases and had email configured, you will need to add a new section of xml as of Obsidian 5.2.0 to handle a new UserInputPanel. Immediately after the UserInputPanel.16 closing brace, add the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;com.izforge.izpack.panels.UserInputPanel id=&amp;quot;UserInputPanel.17&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;userInput&amp;gt;&lt;br /&gt;
        &amp;lt;entry key=&amp;quot;mail.type.selection&amp;quot; value=&amp;quot;javax&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/userInput&amp;gt;&lt;br /&gt;
&amp;lt;/com.izforge.izpack.panels.UserInputPanel&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
* New [[Event_Hooks#REST_Endpoint_Event_Hook|REST Endpoint Event Hook]]&lt;br /&gt;
* [[Key_Server_Proxy|Key Server proxy]] artifact obtained via web download during installation&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Time picker buttons (hour, minute, AM/PM) in [[Admin_Job_Activity#Filtering|Job Activity filtering]] no longer change other elements of the selected time.&lt;br /&gt;
* Cron pattern with [[Cron#Special_Character_Usage|LW]] and any other non-L value in day position no longer also incorrectly evaluates to last day.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.1.1 ==&lt;br /&gt;
Released June 2023&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* [[Authenticator|Native authentication]] no longer fails when user deletes are attempted from the UI.&lt;br /&gt;
* Built in maintenance job [[Built-in_Jobs#Job_History_Cleanup_Job|Job History Cleanup]] no longer leaves deletion candidate CHAIN SKIPPED records in the JOB_HISTORY table in rare circumstances.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.1.0 ==&lt;br /&gt;
Released April 2023&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Admin_Schedule_Aliases#Schedule_Alias_Fragments|Schedule Aliases]] now support fragments for configuration-time substitutions.&lt;br /&gt;
* New convenience job [[Built-in_Jobs#Database_File_Export_Job|Database File Export Job]] for generating basic file extracts from database queries.&lt;br /&gt;
* New convenience job [[Built-in_Jobs#REST_Invocation_Job|REST Invocation Job]] for making simple REST calls and storing results.&lt;br /&gt;
* Performance improvements in job failure handling.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.4 == &lt;br /&gt;
Released February 2022&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.17.1 as fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.17.1 RCE vulnerability] where attackers can modify log4j configuration.&lt;br /&gt;
* Restore missing default log4j2 configuration in installation artifacts.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.3 == &lt;br /&gt;
Released December 2021&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.17.0 as fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.17.0 DOS vulnerability]&lt;br /&gt;
* Fix native login issue showing as inactive on some databases.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.2 == &lt;br /&gt;
Released December 2021&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.16.0 as permanent fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.16.0 RCE vulnerability]&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.1 == &lt;br /&gt;
Released December 2021&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.15.0 as fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.15.0 RCE vulnerability]&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
* Fix sporadic native login issue on some databases.&lt;br /&gt;
* Formatting fix in quick installer file&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.0 == &lt;br /&gt;
Released August 2021.&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Java 11 (minimum Java version)&lt;br /&gt;
* [[Admin_Schedule_Aliases|Schedule Aliases]] including support in [[REST_Endpoints#Schedule_Alias_Endpoints|REST API]] and [[Embedded_API#ScheduleAliasManager_API|Embedded API]]&lt;br /&gt;
* [[Admin_User_Management#Multi-Factor_Authentication_.28MFA.29|MFA Support]] for UI logins&lt;br /&gt;
* New [[Admin_User_Management#User_Rights|Author and Operator]] roles&lt;br /&gt;
* Convention-based role permissions by [[Admin_User_Management#Job_Folder_Rights|root job folder]] for Write, Author and Operator.&amp;lt;ref&amp;gt;&lt;br /&gt;
There is a possibility of a breaking change to Embedded or REST API use due to the need to change the [[Embedded_API#Enumerations|User Role enumeration]] from a Java enum to an enum-style class to support this feature. Bringing in the upgraded Obsidian library and compiling should reveal any such broken use of these enumerations. Needed changes should be minor and self-explanatory.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Bundled Jetty 10.0.2&lt;br /&gt;
* Legacy Embedded API (from Obsidian 1.5) dropped&lt;br /&gt;
* Signal handler disabled by default. Enabled only via [[Advanced_Configuration#Miscellaneous_Properties|configuration]].&lt;br /&gt;
* Many [[Advanced_Configuration#Dependent_Libraries|library upgrades]].&lt;br /&gt;
* UI javascript library updates.&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Main_Page&amp;diff=4101</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Main_Page&amp;diff=4101"/>
		<updated>2026-07-10T17:51:11Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;[[Obsidian]]&#039;&#039;&#039; is a fully-featured Java-based scheduling application which supports load balancing, failover and job workflow. It is designed for [[Deployment Diagram|high availability]], and it is specially built for demanding scheduling environments.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[[Release_Notes#Obsidian_7.0.0|Version 7.0.0]]&#039;&#039;&#039; is the latest release, and was released in July 2026.&lt;br /&gt;
&lt;br /&gt;
Check out &#039;&#039;&#039;[[Getting Started]]&#039;&#039;&#039; if you are looking to set up Obsidian.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;[[User Guide]]&#039;&#039;&#039; will provide all the information you need to use all of Obsidian&#039;s functionality, and provides a quick view of the features Obsidian supports.&lt;br /&gt;
&lt;br /&gt;
Our &#039;&#039;&#039;[[FAQ]]&#039;&#039;&#039; is also worth checking out if you have questions about Obsidian or want more context about what it does.&lt;br /&gt;
&lt;br /&gt;
== Full Administration Capabilities ==&lt;br /&gt;
&lt;br /&gt;
Obsidian features a rich administration web interface, allowing easy monitoring and management. See the &#039;&#039;&#039;[[Admin Web Application Guide]]&#039;&#039;&#039; for details.&lt;br /&gt;
&lt;br /&gt;
[[Image:ObsidianNav 4.0.png]]&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Admin_Global_Parameters&amp;diff=4100</id>
		<title>Admin Global Parameters</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Admin_Global_Parameters&amp;diff=4100"/>
		<updated>2026-07-09T23:06:58Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Implementing_Jobs#Global_Parameters|Global Parameters]] allow you to configure job parameters globally, and then simply import them into jobs as needed.  This screen can be accessed from the primary navigation sidebar, underneath the Configuration parent menu item. &lt;br /&gt;
&lt;br /&gt;
= Global Parameters =&lt;br /&gt;
&lt;br /&gt;
By default, Users who have &#039;&#039;Write&#039;&#039; privileges will be able to edit and save values. Users who have &#039;&#039;Limited Read&#039;&#039; access will see obfuscated values instead of the true configuration values (see [[Admin_Global_Parameters#Customized_Access_Control|Access Control]]).&lt;br /&gt;
&lt;br /&gt;
== Customized Access Control==&lt;br /&gt;
By default, &#039;&#039;&#039;Write&#039;&#039;&#039; users may edit global parameters, and all users except &#039;&#039;Limited Read&#039;&#039; users may view them in clear text. [[Admin Scheduler Settings|Scheduler settings]] &amp;lt;code&amp;gt;globalParamEditAdminRequired&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;globalParamReadAdminRequired&amp;lt;/code&amp;gt; under the &#039;&#039;Dashboard&#039;&#039; category can be used to change this behaviour to restrict these abilities to &#039;&#039;Admin&#039;&#039; users. The former is used to exposed write privileges only to &#039;&#039;Admin&#039;&#039; users, and the latter is used to disallow users other than &#039;&#039;Admin&#039;&#039; users to view actual configured values instead of obfuscated text.&lt;br /&gt;
&lt;br /&gt;
As of Obsidian 7.0.0, these settings also control autocomplete and tooltip behaviour on the job edit screen. When &#039;&#039;&#039;globalParamReadAdminRequired&#039;&#039;&#039; is enabled, users without the necessary permissions will not see global parameter name suggestions when typing &#039;&#039;{{&#039;&#039; in job parameter fields, and resolved values will not appear in hover tooltips.&lt;br /&gt;
&lt;br /&gt;
== Editing Global Parameters ==&lt;br /&gt;
&lt;br /&gt;
This screen allows users to either view or edit global parameter values.&lt;br /&gt;
&lt;br /&gt;
To add a global parameter, click the &#039;&#039;Add Parameter&#039;&#039; button. Global parameters always allow multiple values since they have no fixed definition, and you may add values by clicking the (+) and trash buttons to the right of the field. Any entered values will be validated against the selected type, and the selected type will determine how they are stored. Note that the defined type does not have to match the type of job parameters that reference it - Obsidian will perform automatic type conversion where possible. Data types are defined here so that you can avoid configuration errors.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;Remove&#039;&#039; button will remove the parameter and all its values.&lt;br /&gt;
&lt;br /&gt;
[[Image:GlobalParameters_4.0.png]]&lt;br /&gt;
&lt;br /&gt;
== Saving ==&lt;br /&gt;
&lt;br /&gt;
To save your configuration changes, click the Save button at the bottom of the form. If there are problems with your changes, you will be notified at the top of the screen. You can then correct your entered information and re-save. Upon success, you will see a success confirmation.&lt;br /&gt;
&lt;br /&gt;
== Job Validation ==&lt;br /&gt;
&lt;br /&gt;
When saving changes, any jobs that reference global parameters will be re-validated, which may result in a validation error which prevents you from saving your changes. This is to ensure that jobs always have valid configuration based on their defined parameters, that all referenced global parameters exist, and that data types are consistent. [[Implementing_Jobs#Global_Parameters|Parameterization - Global Parameters]] has more detail on global parameter validation.&lt;br /&gt;
&lt;br /&gt;
== Using Global Parameters in Jobs ==&lt;br /&gt;
&lt;br /&gt;
A global parameter must be defined before using it in a job.&lt;br /&gt;
&lt;br /&gt;
To use an existing global parameter in a job, instead of supplying a literal value, you will supply the global parameter name surrounded by double curly braces (e.g. &amp;lt;code&amp;gt;&amp;amp;#123;&amp;amp;#123;param&amp;amp;#125;&amp;amp;#125;&amp;lt;/code&amp;gt;). Obsidian will see this is a global parameter reference and will import the global parameter values in its place when validating the job and when executing it. The [[Admin Jobs#Global Parameters|Jobs]] screen page has more detail on referencing global parameters.&lt;br /&gt;
&lt;br /&gt;
As of Obsidian 7.0.0, when editing a job, typing &#039;&#039;{{&#039;&#039; in a parameter value field opens an autocomplete suggestion list of available global parameter names, subject to your access control settings above. On the job view screen, hovering over a value containing &#039;&#039;Name&#039;&#039; shows a tooltip with the resolved value when your user has the necessary permissions.&lt;br /&gt;
&lt;br /&gt;
[[File:Obsidian-6.2.0-Global-Parameter-Mouseover.png]]&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Admin_Jobs&amp;diff=4099</id>
		<title>Admin Jobs</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Admin_Jobs&amp;diff=4099"/>
		<updated>2026-07-09T23:04:36Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The job screens give you access to the core of Obsidian&#039;s functionality - scheduling and configuring jobs. This screen can be accessed from the primary navigation sidebar, underneath the Configuration parent menu item.. This page discusses listing and modifying jobs. Other job-related features are discussed on other pages in the [[Admin Web Application Guide|guide]].&lt;br /&gt;
&lt;br /&gt;
= Job Listing =&lt;br /&gt;
&lt;br /&gt;
The default screen shows you a table of existing configured jobs.&lt;br /&gt;
&lt;br /&gt;
[[Image:JobListing_4.1.png]]&lt;br /&gt;
== Fields ==&lt;br /&gt;
&lt;br /&gt;
Fields shown in the job table are:&lt;br /&gt;
&lt;br /&gt;
* Job Nickname (links to job configuration screen)&lt;br /&gt;
* Job Class&lt;br /&gt;
* Folder&lt;br /&gt;
* Status (current)&lt;br /&gt;
* Schedule (current)&lt;br /&gt;
* Submit Run Link (users with Write role only)&lt;br /&gt;
* Clone Job Link (users with Write role only)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Submit Run&#039;&#039; either provides the option to submit a job for immediate or scheduled one-time execution.  A job&#039;s current state must be either Enabled, Ad Hoc Active or Unscheduled Active to support immediate one-time execution.  Otherwise, only future scheduled one-time execution is supported.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Clone Job&#039;&#039; opens up the a new job edit screen pre-populated with the selected job&#039;s configuration, including parameters and schedules.&lt;br /&gt;
&lt;br /&gt;
== Filtering ==&lt;br /&gt;
&lt;br /&gt;
Job records can be optionally filtered by host, status and folder. In the case of each, selecting no options is equivalent to choosing all options . Selected options may be cleared by clicking the (X) next to the dropdown arrow.&lt;br /&gt;
&lt;br /&gt;
When filtering by folder, subfolders are matched when searching by a parent folder. Note that intermediate folders with no contents will be suppressed if they do not offer any search value.&lt;br /&gt;
&lt;br /&gt;
== Exporting Results ==&lt;br /&gt;
The current contents of the table can be exported to Excel, CSV or XML by clicking on export icon displayed at the far right of the table header. The download will automatically begin and will include all pages of the current table of results.&lt;br /&gt;
&lt;br /&gt;
== Ad Hoc &amp;amp; One-Time Run Submission ==&lt;br /&gt;
&lt;br /&gt;
You may submit a job for a single execution by clicking the &#039;&#039;Submit Run&#039;&#039; link in the job listing, which will bring you to a screen to configure your submission.&lt;br /&gt;
&lt;br /&gt;
One-time runs can be submitted either for immediate or scheduled one-time execution. A job&#039;s current state must be either Enabled, Ad Hoc Active or Unscheduled Active to support ad hoc or one-time runs. &lt;br /&gt;
&lt;br /&gt;
The Scheduled Time can be omitted when immediate execution is desired, assuming it is supported as just described.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:AdHocJobSubmission_4.0.png]]&lt;br /&gt;
&lt;br /&gt;
=== Run Parameters ===&lt;br /&gt;
Obsidian allows you to specify [[Implementing_Jobs#Ad_Hoc_.26_One-Time_Run_Parameters|run parameters]] which are supplied to the job for a single execution. To add a parameter, click the &#039;&#039;Add Parameter&#039;&#039; button. You may add values by clicking the (+) and trash buttons to the right of the field. Any entered values will be validated against the selected type, plus against any parameter of the same name defined at the job level, to ensure data types and other restrictions are enforced.  If a parameter name for a run parameter has the same name as a configured job parameter, the job parameter values are dropped, and the run parameter values are used instead.&lt;br /&gt;
&lt;br /&gt;
To remove a parameter and its values, click the &#039;&#039;Remove&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
If you reference a [[Admin_Global_Parameters|global parameter]] by entering a value surrounded by double curly braces (e.g. &amp;lt;code&amp;gt;&amp;amp;#123;&amp;amp;#123;param&amp;amp;#125;&amp;amp;#125;&amp;lt;/code&amp;gt;), Obsidian will resolve this to the values that are configured for the corresponding global parameter (e.g. &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt;). When the job is executed, Obsidian will use the global parameter&#039;s values in place of the global parameter reference. You may use multiple global parameters for a given run parameter by specifying each in its own value field, and they can be combined with regular parameter values, also in their own fields. All imported global parameter values will be validated against applicable job parameter definitions and data types.&lt;br /&gt;
&lt;br /&gt;
= Adding &amp;amp; Editing Jobs = &lt;br /&gt;
&lt;br /&gt;
To add a new job, click the (+) button in the job listing table header.&lt;br /&gt;
&lt;br /&gt;
To edit or view a job&#039;s configuration, click the nickname in the results table.&lt;br /&gt;
&lt;br /&gt;
The job edit screen contains multiple configuration items with which you should be familiar. They are outlined in the sections below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; The question mark icon next to form titles indicates inline help. Click on the icon to view help related to the current item. This is your best source of help when making changes to job details.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:AddJob_4.1.png|300px]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Job Settings ==&lt;br /&gt;
&lt;br /&gt;
=== Nickname, Class and Folder === &lt;br /&gt;
All jobs must have a unique job nickname which identifies the job in logs and event notifications.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;Job Class&#039;&#039; selector allows you to choose existing jobs that Obsidian knows about, and you may also manually type in a custom job (hit enter to confirm and validate). When selecting a job, note that it must be available to all the scheduler nodes (i.e. on the classpath) so that it can retrieve parameter information and validate your configuration. It is not required, nor is it suggested, to keep these classes in the web admin application.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; When selecting or choosing a new job, the defined and custom parameters sections will refresh based on that specific job&#039;s parameter definitions.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;Folder&#039;&#039; selector allows you to select an in use folder, or type in a new folder. Clicking the (x) button will clear the selection so you can type in a custom folder. Jobs can be assigned to folders to help grouping and searching for them. You can use nested paths (e.g. A/B) using forward-slashes. Note that back-slashes will be automatically converted to forward slashes, and multiple slashes in succession are collapsed into a single slash. Leading and trailing slashes are stripped for consistency.&lt;br /&gt;
&lt;br /&gt;
=== Advanced Options ===&lt;br /&gt;
&lt;br /&gt;
This section allows you to specify options related to how jobs are picked up and recovered in exceptional circumstances. Click on &#039;&#039;Advanced Options&#039;&#039; or the chevron next to it to expand or collapse this section.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Recovery Type&#039;&#039; allows you to specify how the job will be handled when execution does not happen normally within the &#039;&#039;Pickup Buffer&#039;&#039; because of conflicts, server downtime, etc.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Startup/Shutdown Mode&#039;&#039; allows you to specify if the job should fire automatically, independently of any defined schedule, in various startup and shutdown scenarios.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Pickup Buffer&#039;&#039; indicates for how many minutes the job is considered within normal execution time from the exact scheduled time. This allows for leniency when dealing with conflicting jobs or with short-term downtime. If a minor delay isn&#039;t significant to your job, using a higher buffer can help prevent jobs from being marked missed or conflict missed unnecessarily.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Auto Retries - #&#039;&#039; allows you to indicate the number of times you wish Obsidian to automatically resubmit (retry) the job for execution when triggered by a non-interrupted execution failure. As of Obsidian 2.0.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Auto Retries - Interval&#039;&#039; allows you to indicate the minimum interval in minutes from the point in time the job failed and the job will be retried. As of Obsidian 2.5.0.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Auto Retries - Exponential&#039;&#039; allows you to indicate if you desire the auto retries interval to exponentially increase as retries are attempted. For example, if you set the interval minutes to 5 and check &#039;&#039;Exponential&#039;&#039;, the first retry will be 5 minutes after failure, the second retry after a subsequent failure will be 10 minutes later, then 20 minutes, and so on. As of Obsidian 2.5.0.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Expected Length&#039;&#039; allows you to trigger event notifications in the event that the job execution is shorter or longer than the durations specified. Both fields are optional, and you are permitted to specify only one of the two. Specify a duration followed by a unit indicator (s-seconds, m-minutes, h-hours), e.g. 45s, 10m or 1h. To receive notifications based on the job running outside these parameters, configure [[Admin Subscribers|subscribers]] at the Warning level or above.  As of Obsidian 1.5.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Auto Interrupt&#039;&#039; allows you to specify if you wish an [[Implementing_Jobs#Interruptable_Jobs|Interruptable Job]] to be interrupted when its maximum expected run length is exceeded. Only available as an option for those jobs that adhere to the [[Implementing_Jobs#Interruptable_Jobs|Interruptable Job]] requirements and have a maximum expected length specified. As of Obsidian 3.4.0.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Fixed Hosts&#039;&#039; allows you to indicate that only certain hosts should run this job. You can select one or more hosts which Obsidian knows about. If a host is not listed and will be started later, simply type in the name and click the (+) button to add it to the list. As of Obsidian 2.2.1, a configuration item allows you to specify whether you wish host restrictions to apply on AdHoc jobs or not. On new installations of 2.2.1, it defaults to TRUE while it defaults FALSE (to maintain behaviour from versions before 2.2.1) on upgrades from prior releases. This can be found under &#039;&#039;&#039;[[Admin_Scheduler_Settings|Scheduler Settings]]/Job/adHocJobsRespectFixedHostsRestrictions&#039;&#039;&#039;. As of version 4.4, you may use a Java regular expression to use pattern matching on the host name. For example, a wildcard match for hosts that start with &amp;quot;abc&amp;quot; can be done with a pattern like &amp;quot;abc.*&amp;quot;. To implement a blacklist of hosts that the job should not run on, a single pattern with negation can be used: &amp;quot;(?!(blacklist-one|blacklist-two)).*&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Host Preference&#039;&#039; indicates that Fixed Hosts are only preferred hosts, and that other available hosts can run the job when none of the preferred hosts are running. When selected, you can also order the hosts using drag &amp;amp; drop. Obsidian will always choose the highest priority host to run the job if one is available.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Chain All&#039;&#039; allows you  allows you specify the behaviour when this job is to be chained but is executing another instance at that moment. By default, only one newly chained instance will be queued. Choose this option to chain all such occurrences. Each chained target instance is queued for the same minute. Ensure your Pickup Buffer is set large enough for these to be picked up and run in sequence.&lt;br /&gt;
&lt;br /&gt;
== Schedule ==&lt;br /&gt;
&lt;br /&gt;
When adding a new job, the schedule section will allow you to specify the initial schedule. You will have the ability to overwrite, adjust or add new schedules after initial creation. Schedule is required only for enabled jobs and is ignored for other states. See [[#Date Fields|Date Fields]] for details on how the date and time fields can be used. [[Cron]] patterns are used to specify the schedule or you may use custom [[Cron#Recurrence | Recurrence]] expressions. &lt;br /&gt;
&lt;br /&gt;
Multiple cron patterns may be specified for a single schedule by delimiting them with a semi-colon (e.g. &amp;lt;code&amp;gt;35 8 * * * *;20 12 * * *;40 16 * * *&amp;lt;/code&amp;gt;). This means that the job will fire if it matches any of the supplied patterns.&lt;br /&gt;
&lt;br /&gt;
If you specify start and end dates, any dates outside this range will be initially set to the Disabled States.&lt;br /&gt;
&lt;br /&gt;
=== State ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Enabled&#039;&#039; is the standard state that allows scheduling, chaining, and one-time run submissions. This is the only state that takes a schedule [[Cron]] pattern.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Disabled&#039;&#039; allows you to disable the job completely during the specified window.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Chain Active&#039;&#039; allows the job to be executed as a chain target only.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Ad Hoc Active&#039;&#039; allows the job to be submitted and executed for one-time runs only. Note that a one-time run must be requested after saving your job configuration for the job to be executed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Unscheduled Active&#039;&#039; allows the job to be executed as a chain target and also allows the job to be submitted and executed for one-time runs upon request. Note that a one-time run must be requested after saving your job configuration for the job to be executed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; When editing a job, the schedule section shows a read-only view of the active schedule, or if one is not active yet, the first schedule that will become active.&lt;br /&gt;
&lt;br /&gt;
=== Date Fields ===&lt;br /&gt;
&lt;br /&gt;
Dates and times are used to specify schedule start and end times. &lt;br /&gt;
&lt;br /&gt;
From and To fields will show user-friendly date and time selectors which enforce a valid date range. If you cannot select a date in the past or future, it is because the date widget is enforcing a valid time, and you may need to edit your from or to times appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; If you wish minute-level specificity, simply manually type your time into the time field in the 24-hour format HH:MM. You do not have to use the time selector.&lt;br /&gt;
&lt;br /&gt;
There is some helpful behaviour when you wish a schedule to be indefinite and immediately active. You do not have to specify times in this common case:&lt;br /&gt;
&lt;br /&gt;
* Blank from dates will be treated as today&#039;s date.&lt;br /&gt;
* Blank from times will be treated as the next valid minute, unless a non-current date is specified, in which case it is treated as midnight.&lt;br /&gt;
* Blank to dates will be considered as indefinite (no end).&lt;br /&gt;
* Blank to times will be considered as end of day (11:59 PM), or indefinite when the to date is blank.&lt;br /&gt;
&lt;br /&gt;
=== Edit, View &amp;amp; Change Schedules ===&lt;br /&gt;
&lt;br /&gt;
After you have saved the initial job configuration, you can then make schedule changes and additions. &lt;br /&gt;
&lt;br /&gt;
When saving a new job or loading an existing job&#039;s configuration, you will see the current schedule in a read-only view in the &#039;&#039;Schedule&#039;&#039; section.&lt;br /&gt;
&lt;br /&gt;
To update the current schedule or create a future schedule, click the &#039;&#039;Edit&#039;&#039; button, then make your changes. New schedules may overlap, contain or be within existing schedules with no issue. Obsidian will automatically split and merge schedules to create a complete schedule based on your changes. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:JobSchedule_4.0.png]]&lt;br /&gt;
&lt;br /&gt;
If you wish to abandon your schedule changes, click the &#039;&#039;Revert&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
[[Image:JobScheduleRevert_4.0.png]]&lt;br /&gt;
&lt;br /&gt;
To simply replace any current schedules with a new permanent schedule, leave the time fields blank, and it will become active indefinitely at the beginning of the next minute.&lt;br /&gt;
&lt;br /&gt;
Clicking the &#039;&#039;View All&#039;&#039; button will show all schedules that have been configured that are active now or in the future. The &#039;&#039;Include Expired&#039;&#039; checkbox can be used to include expired schedules in the listing. This will be the existing schedules if no new schedule is entered, or a preview of the new altered schedules based on your input if specified. This allows you to view the effect of your changes before confirming them.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; In order to save your schedule changes, you&#039;ll need to save the job itself. If you click the &#039;&#039;Revert&#039;&#039; button after making schedule changes, they will be discarded and will not be included if you then click Save.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Below you can see the &#039;&#039;View All&#039;&#039; button being used to view the current schedules without making any changes.&lt;br /&gt;
&lt;br /&gt;
[[Image:NewJobSchedule_4.0.png]]&lt;br /&gt;
&lt;br /&gt;
=== Custom Calendar Assignment ===&lt;br /&gt;
&lt;br /&gt;
An Enabled Schedule may also be assigned a [[Admin_Custom_Calendars|Custom Calendar]]. Use this to prevent scheduling/execution on the dates specified by the Custom Calendar.&lt;br /&gt;
&lt;br /&gt;
[[Image:CustomCalendarAssignment_4.0.png]]&lt;br /&gt;
&lt;br /&gt;
== Parameters ==&lt;br /&gt;
&lt;br /&gt;
=== Defined Parameters ===&lt;br /&gt;
&lt;br /&gt;
If a job has defined parameters as discussed in [[Implementing Jobs]], this section will show the configurable parameters. The label on the left will indicate the name and type of the parameter.&lt;br /&gt;
&lt;br /&gt;
If the parameter definition allows multiple values, buttons to the right of the text field will allow you to add or remove values. Note that remove will not appear for the first item, and if you wish to omit the parameter value, simply leave the first field blank. &lt;br /&gt;
&lt;br /&gt;
If the parameter is defined to use a [[Implementing_Jobs#List_Parameterization|list of values]], a select list will be presented instead of a text box.&lt;br /&gt;
&lt;br /&gt;
Asterisks indicate required values.&lt;br /&gt;
&lt;br /&gt;
=== Custom Parameters ===&lt;br /&gt;
&lt;br /&gt;
In addition to defined parameters, you always have the option of specifying custom parameters, which the job may use in a dynamic fashion. In the &#039;&#039;Parameters&#039;&#039; section, click on &#039;&#039;Custom&#039;&#039; or the chevron next to it to expand or collapse this section.&lt;br /&gt;
&lt;br /&gt;
To add a custom parameter, click the &#039;&#039;Add Custom Parameter&#039;&#039; button. Custom parameters always allow multiple values since they have no fixed definition, and you may add values by clicking the (+) and trash buttons to the right of the field. Any entered values will be validated against the selected type, and the selected type will determine how they are stored and provided to the job.&lt;br /&gt;
&lt;br /&gt;
To remove a custom parameter and its values, click the &#039;&#039;Remove&#039;&#039; button.&lt;br /&gt;
&lt;br /&gt;
Custom parameters support global parameter references. As of Obsidian 7.0.0, autocomplete and hover tooltips for global parameter references are also available on custom parameter fields (see [[#Global_Parameters|Global Parameters]] above).&lt;br /&gt;
&lt;br /&gt;
=== Global Parameters ===&lt;br /&gt;
&lt;br /&gt;
Both defined and custom parameters support the usage of [[Admin_Global_Parameters|global parameters]]. These let you configure job parameters globally, and then simply import them into jobs as needed.&lt;br /&gt;
&lt;br /&gt;
To use a global parameter in a job, simply enter its name surrounded by double curly braces (e.g. &amp;lt;code&amp;gt;&amp;amp;#123;&amp;amp;#123;param&amp;amp;#125;&amp;amp;#125;&amp;lt;/code&amp;gt;) in the value field, and Obsidian will locate the matching global parameter (e.g. &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt;). When the job is executed, Obsidian discards the global parameter reference and replaces it with the current global parameter values. You may use multiple global parameters for a given parameter by specifying each in its own value field, and they can be combined with regular parameter values, also in their own fields. All imported global parameter values will be validated against applicable job parameter definitions and data types. Note that Obsidian does not support global parameter references embedded inside parameter values, since it does not perform text substitution - only parameter values containing only the global parameter reference will be replaced with the global parameter value.&lt;br /&gt;
&lt;br /&gt;
When you save your job changes, Obsidian will validate that any reference global parameter values match your defined data types and other parameter restrictions.&lt;br /&gt;
&lt;br /&gt;
See [[Implementing_Jobs#Global_Parameters|Parameterization - Global Parameters]] for more details on type handling and validation of global parameters.&lt;br /&gt;
&lt;br /&gt;
As of Obsidian 7.0.0, when editing a job, typing &#039;&#039;{{&#039;&#039; in a parameter value field opens an autocomplete suggestion list of available global parameter names. Select a name with Enter or a click, or dismiss with Esc. The suggestions are subject to your user&#039;s permissions and configuration settings — see [[Advanced_Configuration|Advanced Configuration]] for details.&lt;br /&gt;
&lt;br /&gt;
On the job &#039;&#039;&#039;view&#039;&#039;&#039; screen (read-only), hovering over a parameter value that contains &#039;&#039;{{Name}}&#039;&#039; shows a tooltip with the resolved global parameter value, when your user has the necessary permissions.&lt;br /&gt;
&lt;br /&gt;
== Saving ==&lt;br /&gt;
&lt;br /&gt;
To save your configuration changes, click the Save button at the bottom of the form or in the left navigation area. If there are problems with your changes, you will be notified at the top of the screen. You can then correct your entered information and re-save. Upon success, you will see a success confirmation.&lt;br /&gt;
&lt;br /&gt;
== Deleting ==&lt;br /&gt;
&lt;br /&gt;
You can delete a job and all its history and configuration from Obsidian.  We recommend you use this feature sparingly. It is most useful on long-obsolete jobs.  When you attempt to delete a job, Obsidian will ask for your confirmation along with prompting you with a choice.  &lt;br /&gt;
&lt;br /&gt;
Deleting a job in Obsidian assumes you are fine with losing all runtime results, defined parameters and any schedules and states.  You will also lose any chain references from this job, i.e if a job was chained from the job you&#039;re deleting, it will show as chained, but the source job information will be lost.  Since jobs can have an impact on other jobs, namely chaining and conflict configuration, the default delete will fail to complete if there are any active chains referencing the job in question or if the job is included in any conflict groups.  Optionally, you can also select the option &#039;&#039;Delete all active job configuration?&#039;&#039; in the Delete Job window and this will delete any of these as well.&lt;br /&gt;
&lt;br /&gt;
[[Image:DeleteJobWindow_4.0.png]]&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Installation_Guide&amp;diff=4098</id>
		<title>Installation Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Installation_Guide&amp;diff=4098"/>
		<updated>2026-07-09T21:52:29Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;This installation guide generally applies to Obsidian versions 4.0 and newer but is specific to 7.0. You may see a few minor differences in 4.x, 5.x and 6.x releases. See the [[Installation_Guide_(3.x.x_and_earlier)|Installation Guide]] for all prior versions.&lt;br /&gt;
&lt;br /&gt;
This installation guide is a companion to the Obsidian Installer UI. Its purpose is to provide additional detail as to the meaning of various inputs and to provide guidance on advanced usage of the installer.&lt;br /&gt;
&lt;br /&gt;
The installer itself installs and configures the artifacts. The configured artifacts will have their [[Advanced_Configuration#Properties_File|Properties]] file configured according to the choices made during the installation process. You may always change these later or use one of the [[Advanced_Configuration#Properties_File|override]] mechanisms.&lt;br /&gt;
== Running the Obsidian Installer ==&lt;br /&gt;
The installer is an executable JAR file in the Obsidian download zip package available on our [https://web.obsidianscheduler.com/download/ download page].&lt;br /&gt;
&lt;br /&gt;
The installer can be run from the command line as a graphical user interface using &amp;lt;code&amp;gt;java -jar Obsidian-Install-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;.jar&amp;lt;/code&amp;gt; or in interactive console mode using &amp;lt;code&amp;gt;java -jar Obsidian-Install-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;.jar -console&amp;lt;/code&amp;gt;. Note that you will have to replace the JAR file name with the actual versioned name in your installation.&lt;br /&gt;
&lt;br /&gt;
On some platforms, simple double-clicking the JAR file will start it in graphical interface mode.&lt;br /&gt;
&lt;br /&gt;
If you are doing a version upgrade of Obsidian or are otherwise uninterested in actually configuring the artifacts, you can run the quick start mode to get the default configured artifacts using &amp;lt;code&amp;gt;java -jar Obsidian-Install-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;.jar h2-winstone-quick-start.xml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Obsidian Installer Artifacts ==&lt;br /&gt;
&lt;br /&gt;
The Obsidian Installer installs and configures a number of artifacts. You can choose which artifacts to create, but most users can leave the default options selected.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-7.0.0-Installation-Packages.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Obsidian WAR&#039;&#039;&#039; - This is the Obsidian Web Admin UI with scheduler component enabled. Configuration will be found at &#039;&#039;INSTALL_PATH&#039;&#039;/obsidian.war!/WEB-INF/classes/com.carfey.properties.&lt;br /&gt;
# &#039;&#039;&#039;Obsidian Standalone Admin WAR&#039;&#039;&#039; - This is the Obsidian Web Admin UI with scheduler component disabled. Configuration will be found at &#039;&#039;INSTALL_PATH&#039;&#039;/standaloneObsidianAdmin.war!/WEB-INF/classes/com.carfey.properties.&lt;br /&gt;
# &#039;&#039;&#039;Standalone Obsidian Runtime&#039;&#039;&#039; - This is a runtime folder containing the libraries and configuration necessary for running the Obsidian Scheduler component either as a standalone module or for use as an Embedded Scheduler in your application. Configuration will be found at &#039;&#039;INSTALL_PATH&#039;&#039;/standalone/obsidian-props.jar!/com.carfey.properties.&lt;br /&gt;
# &#039;&#039;&#039;Obsidian License Proxy&#039;&#039;&#039; - Allows for local license leasing from a [[Key_Server_Proxy|Key Server Proxy]] that ultimately leases licenses from the Obsidian License server.&lt;br /&gt;
# &#039;&#039;&#039;Documentation&#039;&#039;&#039; - README and Embedded API Javadoc.&lt;br /&gt;
# &#039;&#039;&#039;Obsidian Embedded Tomcat JAR&#039;&#039;&#039; — An embedded Apache Tomcat runtime for running Obsidian locally without an external servlet container. Requires the Obsidian WAR pack.&lt;br /&gt;
# &#039;&#039;&#039;Obsidian Standalone Admin Embedded Tomcat JAR&#039;&#039;&#039; — An embedded Apache Tomcat runtime for running the standalone admin WAR locally. Requires the Obsidian Standalone Admin WAR pack.&lt;br /&gt;
# &#039;&#039;&#039;License&#039;&#039;&#039; - Obsidian and 3rd party license information.&lt;br /&gt;
&lt;br /&gt;
==== Deployment options ====&lt;br /&gt;
&lt;br /&gt;
Obsidian 7.0.0 offers four deployment profiles in the installer:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Obsidian WAR&#039;&#039;&#039; — deploy &#039;&#039;&#039;obsidian.war&#039;&#039;&#039; to your own servlet container (Tomcat, WebLogic, etc.).&lt;br /&gt;
* &#039;&#039;&#039;Obsidian Embedded Tomcat JAR&#039;&#039;&#039; — adds an embedded Tomcat runtime and &#039;&#039;&#039;webObsidian&#039;&#039;&#039; scripts to run &#039;&#039;&#039;obsidian.war&#039;&#039;&#039; locally (&#039;&#039;&#039;start scheduler&#039;&#039;&#039;). &#039;&#039;&#039;Requires&#039;&#039;&#039; the Obsidian WAR pack.&lt;br /&gt;
* &#039;&#039;&#039;Obsidian Standalone Admin WAR&#039;&#039;&#039; — admin console WAR for an external servlet container.&lt;br /&gt;
* &#039;&#039;&#039;Obsidian Standalone Admin Embedded Tomcat JAR&#039;&#039;&#039; — embedded runtime for the admin WAR (&#039;&#039;&#039;start adminOnly&#039;&#039;&#039;). &#039;&#039;&#039;Requires&#039;&#039;&#039; the Standalone Admin WAR pack.&lt;br /&gt;
&lt;br /&gt;
Embedded Tomcat does &#039;&#039;&#039;not&#039;&#039;&#039; replace the WAR on disk — it runs the installed WAR via the helper. Do not select an embed pack without its matching WAR pack.&lt;br /&gt;
&lt;br /&gt;
== Obsidian Configuration ==&lt;br /&gt;
&lt;br /&gt;
The installer will guide you through the configuration Obsidian.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-7.0.0-Configuring-Obsidian.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
First, you must choose what [[Authenticator]] mechanism will be used within Obsidian. &#039;&#039;Native (Database)&#039;&#039; authentication requires no additional configuration and is what most users will select. Select &#039;&#039;Other&#039;&#039; if you have implemented your own authentication mechanism, OAuth (OIDC), SAML or LDAP according to your desired mechanism. &lt;br /&gt;
&lt;br /&gt;
Next, you&#039;ll want to select the email usage type. We highly recommend you configure Obsidian for email use as it will allow you to benefit from the event [[Event_Notifications|notification]] and [[Admin_Notifications|subscription]] support in Obsidian.&lt;br /&gt;
&lt;br /&gt;
Then you&#039;ll configure the log file location, license key (optional) and registered company name (optional). Registered company name is only required for our Site License users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== OAuth / OIDC Configuration ====&lt;br /&gt;
&lt;br /&gt;
If you selected &#039;&#039;&#039;OAuth (OIDC)&#039;&#039;&#039; as the authentication type, the installer displays additional panels for OAuth configuration.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Provider and Common Settings =====&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-7.0.0-Configuring-OAuth_OIDC.png]]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Identity Provider&#039;&#039;&#039; — Select your provider: Keycloak, Microsoft Entra ID, Okta, Auth0, or Generic OIDC.&lt;br /&gt;
* &#039;&#039;&#039;SSO Button label&#039;&#039;&#039; — Label shown on the &amp;quot;Sign in with…&amp;quot; button (e.g. &#039;&#039;Keycloak&#039;&#039;, &#039;&#039;Acme Corp SSO&#039;&#039;). If left blank the button reads &amp;quot;Sign in with SSO&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Redirect URI&#039;&#039;&#039; — The callback URL Obsidian receives after IdP login. Must be registered at the IdP (e.g. &#039;&#039;https://app.example.com/oauth/callback&#039;&#039;).&lt;br /&gt;
* &#039;&#039;&#039;Logout mode&#039;&#039;&#039; — &#039;&#039;local&#039;&#039; (default) or &#039;&#039;rp&#039;&#039; (RP-initiated logout via the IdP&#039;s end_session_endpoint).&lt;br /&gt;
&lt;br /&gt;
===== Provider-Specific Settings =====&lt;br /&gt;
&lt;br /&gt;
Fill in the connection details for your chosen provider.&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-7.0.0-Configuring-Keycloak.png]]&lt;br /&gt;
&lt;br /&gt;
;Keycloak&lt;br /&gt;
* &#039;&#039;&#039;Issuer URL&#039;&#039;&#039; — e.g. &#039;&#039;https://keycloak.example.com/realms/myrealm&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Client ID&#039;&#039;&#039; and &#039;&#039;&#039;Client Secret&#039;&#039;&#039; from the Keycloak client settings.&lt;br /&gt;
* &#039;&#039;&#039;Scopes&#039;&#039;&#039; — recommended: &#039;&#039;openid profile email groups&#039;&#039;. &lt;br /&gt;
Note: Keycloak does not include a &#039;&#039;groups&#039;&#039; claim by default — a Group Membership mapper must be configured in the client&#039;s Mappers tab.&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-7.0.0-Configuring-Microsoft-Entra-ID.png]]&lt;br /&gt;
&lt;br /&gt;
;Microsoft Entra ID&lt;br /&gt;
* &#039;&#039;&#039;Issuer URL&#039;&#039;&#039; — &#039;&#039;https://login.microsoftonline.com/&amp;lt;tenant-id&amp;gt;/v2.0&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Client ID&#039;&#039;&#039; — the Application (client) ID from the Azure portal.&lt;br /&gt;
* &#039;&#039;&#039;Client Secret&#039;&#039;&#039; — a client secret value from the Azure portal.&lt;br /&gt;
* &#039;&#039;&#039;Scopes&#039;&#039;&#039; — &#039;&#039;openid profile email&#039;&#039;. &lt;br /&gt;
Note: the &#039;&#039;groups&#039;&#039; claim contains GUIDs by default; configure Optional Claims in the Azure portal to receive group display names. &lt;br /&gt;
&#039;&#039;&#039;Multi-tenant applications are not supported in Obsidian 7.0.0.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-7.0.0-Configuring-Okta.png]]&lt;br /&gt;
&lt;br /&gt;
;Okta&lt;br /&gt;
* &#039;&#039;&#039;Issuer URL&#039;&#039;&#039; — use the &#039;&#039;&#039;Custom Authorization Server&#039;&#039;&#039; URL, e.g. &#039;&#039;https://&amp;lt;domain&amp;gt;.okta.com/oauth2/default&#039;&#039;. Do &#039;&#039;&#039;not&#039;&#039;&#039; use the Org Authorization Server URL.&lt;br /&gt;
* &#039;&#039;&#039;Client ID&#039;&#039;&#039; and &#039;&#039;&#039;Client Secret&#039;&#039;&#039; from Okta application settings.&lt;br /&gt;
* &#039;&#039;&#039;Scopes&#039;&#039;&#039; — &#039;&#039;openid profile email groups&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-7.0.0-Configuring-Auth0.png]]&lt;br /&gt;
&lt;br /&gt;
;Auth0&lt;br /&gt;
* &#039;&#039;&#039;Domain / Issuer URL&#039;&#039;&#039; — e.g. &#039;&#039;https://&amp;lt;domain&amp;gt;.auth0.com/&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;Client ID&#039;&#039;&#039; and &#039;&#039;&#039;Client Secret&#039;&#039;&#039; from Auth0 application settings.&lt;br /&gt;
* &#039;&#039;&#039;Scopes&#039;&#039;&#039; — &#039;&#039;openid profile email&#039;&#039;.&lt;br /&gt;
&#039;&#039;&#039;Important:&#039;&#039;&#039; Auth0 issues opaque access tokens by default which are &#039;&#039;&#039;not supported&#039;&#039;&#039; on Obsidian&#039;s REST/Bearer path — configure a custom API in Auth0 to get JWT access tokens.&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-7.0.0-Configuring-Generic_OIDC.png]]&lt;br /&gt;
&lt;br /&gt;
;Generic OIDC&lt;br /&gt;
* &#039;&#039;&#039;Issuer URL&#039;&#039;&#039; — the base URL; Obsidian appends &#039;&#039;/.well-known/openid-configuration&#039;&#039; to discover endpoints.&lt;br /&gt;
* &#039;&#039;&#039;Client ID&#039;&#039;&#039; and &#039;&#039;&#039;Client Secret&#039;&#039;&#039; from the provider.&lt;br /&gt;
* &#039;&#039;&#039;Scopes&#039;&#039;&#039; — at minimum &#039;&#039;openid&#039;&#039;; add &#039;&#039;profile&#039;&#039; and your groups scope as needed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===== Group → Role Mapping =====&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-7.0.0-OAuth-Group-Role-Mapping.png]]&lt;br /&gt;
&lt;br /&gt;
The final OAuth panel maps IdP group values to Obsidian roles. &#039;&#039;&#039;Require role assignment&#039;&#039;&#039; (default yes) — when enabled, users with no matching roles cannot complete browser login. At least one mapping to the &#039;&#039;&#039;Admin&#039;&#039;&#039; role is required. The installer supports up to 10 group→role pairs; additional pairs can be added directly to the configuration file after install. See [[Advanced_Configuration#OAuth_/_OIDC_Authentication_Properties]] for the full property reference.&lt;br /&gt;
&lt;br /&gt;
===== Registering the redirect URI at the IdP =====&lt;br /&gt;
&lt;br /&gt;
Before starting Obsidian, register the redirect URI shown in the installer at your IdP: Keycloak — Client → Settings → Valid Redirect URIs; Entra ID — App Registration → Authentication → Redirect URIs; Okta — Application → General Settings → Sign-in Redirect URIs; Auth0 — Application → Settings → Allowed Callback URLs. The URI must match &#039;&#039;com.carfey.suite.security.OAuthAuthenticator.redirectUri&#039;&#039; exactly, including scheme and port.&lt;br /&gt;
&lt;br /&gt;
==== LDAP Configuration ====&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Configure.LDAP.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you&#039;ve selected LDAP Authentication, this screen takes you through configuring the server address and the various elements used to grant access. You should familiarize yourself with Obsidian [[Authenticator#Roles|Roles]]. The &#039;&#039;Access DN&#039;&#039; configuration element grants Read access to Obsidian application. You may use the same DN for more than one Role should you so wish.&lt;br /&gt;
&lt;br /&gt;
==== Custom Authenticator Configuration====&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Configure.CustomAuthenticator.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you have chosen to use your own authentication mechanism, you must enter the fully qualified classname here.&lt;br /&gt;
&lt;br /&gt;
==== Database Configuration ====&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Database.Configuration.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next comes database configuration. If you are using JNDI, leave the username and password fields blank. If using JDBC URL, username and password fields are required.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;Database connections per instance&#039;&#039; and &#039;&#039;Database connection timeout(millis)&#039;&#039; fields are required and provide directive to the connection pool.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Database table name prefix&#039;&#039; is optional and is typically used when Obsidian will be colocated in an existing database/schema.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Database schema (Oracle/PostgreSQL)&#039;&#039; - This is used to allow for an alternate schema other than the default user&#039;s schema. We also recommend setting this value with Oracle/PostgreSQL when using JNDI as it allows more efficient database metadata loading.&lt;br /&gt;
&lt;br /&gt;
By default, the Obsidian installation will only include the JDBC libraries necessary for your particular database. At times you may wish to include the others to be able to change between databases. In those cases, check &#039;&#039;Include all supported JDBC libs&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Email Configuration ====&lt;br /&gt;
&lt;br /&gt;
If not using JNDI for mail sessions, provide the server and authentication details as required.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Configure.SSL.Email.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Configure.TLS.Email.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Configure.Open.Email.png]]&lt;br /&gt;
&lt;br /&gt;
==== JNDI Configuration ====&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Configure.JNDI.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you have selected JNDI for mail sessions, provide the JNDI path here. If you are using JNDI for Database connections, specify the database type.&lt;br /&gt;
&lt;br /&gt;
==== Configuring 3rd Party Library Conflict Management ====&lt;br /&gt;
[[Image:JarJar-Obsidian-6.0.0.png]]&lt;br /&gt;
&lt;br /&gt;
The Obsidian installer allows you to use [https://code.google.com/archive/p/jarjar JarJar] to handle potential conflicts between Obsidian&#039;s use of 3rd party libraries and versions used within your application. On this screen, simply select which libraries to which you wish to apply the JarJar bytecode modification process. This is optional and is skipped if no libraries are selected. Any jars not listed for which you are using more recent versions can be used and are therefore not included as options in the JarJar processing.&lt;br /&gt;
&lt;br /&gt;
==== Selecting Script Libraries ====&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-6.0.0-Choose-Scripting-Libraries.png]]&lt;br /&gt;
&lt;br /&gt;
The Obsidian installer allows you to select which script libraries you wish to include. Jython and JRuby are incompatible with each other, so the installer will only allow one of the two selected. If all script libraries are deselected, the only script jobs that can be run in Obsidian will be Javascript jobs as that engine is built into Java.&lt;br /&gt;
&lt;br /&gt;
==== Choosing Email Support ====&lt;br /&gt;
As of Obsidian 5.2.0, you can choose between JavaMail (javax) and Jakarta mail (Jakarta EE) implementations. When choosing Jakarta, you can also choose to bundle the Angus Jakarta compatible implementation. &lt;br /&gt;
&lt;br /&gt;
If you are using JNDI, this will only include the relevant support in the Obsidian WAR artifacts and the actual libraries in use must be provided by you and bundled with your container. If the standalone scheduler is selected along with JNDI, JNDI is assumed only relevant for WARs. As such, default libraries for either JavaMail or Jakarta will be included in the standalone installation.&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.EmailImplementation.Configuration.png]]&lt;br /&gt;
&lt;br /&gt;
==== Additional configuration items ====&lt;br /&gt;
&lt;br /&gt;
As of Obsidian 5.5.0, if you require any additional configuration items such as additional appenders/loggers or event hook configurations, you can add them here.&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.5.0.Extra.Configuration.png]]&lt;br /&gt;
&lt;br /&gt;
==== Offline or restricted-network install ====&lt;br /&gt;
&lt;br /&gt;
Obsidian 7.0.0 resolves third-party libraries when you run the installer. For environments without direct access to Maven Central:&lt;br /&gt;
&lt;br /&gt;
# Pre-stage a local dependency cache containing every coordinate listed in the Obsidian dependency inventory for your release (contact Carfey support or your account team for the checklist file matching &#039;&#039;&#039;Obsidian-Install-7.0.0.jar&#039;&#039;&#039;).&lt;br /&gt;
# Copy the cache to the install host. Two layouts are supported:&lt;br /&gt;
#* &#039;&#039;&#039;Flat:&#039;&#039;&#039; one file per installed JAR name directly under the cache root.&lt;br /&gt;
#* &#039;&#039;&#039;File Maven repo:&#039;&#039;&#039; &#039;&#039;&#039;&amp;lt;group&amp;gt;/&amp;lt;artifact&amp;gt;/&amp;lt;version&amp;gt;/&amp;lt;installed-filename&amp;gt;.jar&#039;&#039;&#039;&lt;br /&gt;
# Run the installer with offline mode and the cache directory:&lt;br /&gt;
&lt;br /&gt;
 java -Dobsidian.install.deps.offline=true -Dobsidian.install.deps.cache.dir=/path/to/cache -jar Obsidian-Install-7.0.0.jar&lt;br /&gt;
&lt;br /&gt;
If a required library is missing from the cache, the install stops with an error naming the coordinate — add that artifact to the cache and re-run.&lt;br /&gt;
&lt;br /&gt;
===== Corporate Maven mirror (online) =====&lt;br /&gt;
&lt;br /&gt;
When your site mirrors Maven Central, point the installer at your repository base URL:&lt;br /&gt;
&lt;br /&gt;
 java -Dobsidian.install.deps.repo.url=https://nexus.example.com/repository/maven-public/ -jar Obsidian-Install-7.0.0.jar&lt;br /&gt;
&lt;br /&gt;
The installer reuses resolved artifacts for the duration of one install session.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Completing the Installation ==&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Finished.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Once you&#039;ve completed the Installation and Configuration screens, fully configured Obsidian Scheduler artifacts are now ready for you to use in the installation path you selected.&lt;br /&gt;
&lt;br /&gt;
Should you wish to automate future installations with the same configuration, click &#039;&#039;Generate an automatic installation script&#039;&#039;. This will prompt you to save an XML file that can be used for future installations using the automated install procedure &amp;lt;code&amp;gt;java -jar Obsidian-Install-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;.jar my-obsidian-configuration.xml&amp;lt;/code&amp;gt;. Every effort is made to ensure compatibility of these automated install files between versions. Any incompatibility will be noted in the [[Release_Notes|Release Notes]]. These automated installer files can also be used as templates for other environments, modifying them as necessary.&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Advanced_Configuration&amp;diff=4097</id>
		<title>Advanced Configuration</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Advanced_Configuration&amp;diff=4097"/>
		<updated>2026-07-09T21:00:19Z</updated>

		<summary type="html">&lt;p&gt;Craig: /* Dependent Libraries */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Obsidian requires some initial configuration parameters for database connection information and desired authentication mechanisms.  The installer takes care of configuring these as provided.  For your reference should you wish to manually create/edit these, note the details below.&lt;br /&gt;
&lt;br /&gt;
== Configuration Details ==&lt;br /&gt;
&lt;br /&gt;
The following sections show the available properties and sample values that can be used in the &amp;lt;code&amp;gt;com.carfey.properties&amp;lt;/code&amp;gt; properties file. While properties format is shown, all the same configuration items apply to yaml support. See [[#Properties.2FYaml_File|Properties/Yaml File]] for more details on this file.&lt;br /&gt;
&lt;br /&gt;
=== Authentication Properties ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Comment out the native authenticator setup&lt;br /&gt;
#com.carfey.suite.security.Authenticator=com.carfey.suite.security.DBAuthenticator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== LDAP Authentication Properties ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#Set your LDAP info here&lt;br /&gt;
com.carfey.suite.security.Authenticator=com.carfey.suite.security.LdapAuthenticator&lt;br /&gt;
# As of Obsidian 2.1.1, you can specify the attribute type used in building up the distinguished name (dn). If unspecified, defaults to cn&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.dn.attribute=uid&lt;br /&gt;
# As of Obsidian 4.5.0, you can provide a delimited list (delimiter is 3 tildes ~~~) of dn.bases to search.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.dn.base=ou=people,o=MyOrgHere&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.url=ldap://localhost:10389&lt;br /&gt;
# As of Obsidian 2.1.1, you can specify the SECURITY_AUTHENTICATION. Defaults to simple. &lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.securityAuthentication=simple&lt;br /&gt;
# Any necessary additional information such as Provider, Principal and Host will need to be handled in your custom class extending LdapAuthenticator.&lt;br /&gt;
&lt;br /&gt;
# As of Obsidian 3.5.1, you can login via an LDAP attribute that is not part of the dn. A matching entry is found in the LDAP Directory (using anonymous or a fixed lookup account) &lt;br /&gt;
# after which the dn attribute above is retrieved to perform the user&#039;s authentication. The following 5 attributes are only used for this type of lookup and authentication.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.lookupDnAttribute=false&lt;br /&gt;
# As of Obsidian 3.5.1, this is the attribute name that is being searched for in the LDAP directory to build the dn for eventual authentication.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.loginAttribute=sAMAccountName&lt;br /&gt;
# As of Obsidian 3.5.1, this determines if these lookups will be done anonymously (without a session authenticated by user/password)&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.anonymousEnabled=false&lt;br /&gt;
# As of Obsidian 3.5.1, if anonymous lookups are not permitted or desired, provide the dn and password to be used for lookups. Typically, a read-only account with &lt;br /&gt;
# read rights to the LDAP entries and attributes in question is sufficient.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.searchUserFullDn=cn=ObsidianLDAPReadOnly,ou=people,o=MyOrgHere&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.searchPassword=password&lt;br /&gt;
# As of Obsidian 4.5.1, an alternate search base configuration parameter is used for the searchUser&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.searchUserDnBase=ou=people,o=MyOrgHere&lt;br /&gt;
# As of Obsidian 4.7.1, you may specify one or more additional group membership attributes beyond the defaults&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.groupMembershipAttribute=businessGroup~~~departmentName&lt;br /&gt;
&lt;br /&gt;
# Configure who may access the web app, based on LDAP group membership&lt;br /&gt;
# As of Obsidian 4.5.0, you can provide a delimited list (delimiter is 3 tildes ~~~) of groups to search.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.accessDN=cn=SchedulerAccess,ou=groups,o=MyOrgHere&lt;br /&gt;
&lt;br /&gt;
# Configure the Write role used in the admin web app, based on LDAP group membership (by default, users may only read)&lt;br /&gt;
# As of Obsidian 4.5.0, you can provide a delimited list (delimiter is 3 tildes ~~~) of groups to search.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.write.dn=cn=SchedulerWrite,ou=groups,o=MyOrgHere&lt;br /&gt;
# No need to alter this&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.write.roleName=Write&lt;br /&gt;
&lt;br /&gt;
# Configure the Admin role used in the admin web app, based on LDAP group membership (users may configure system parameters, etc).&lt;br /&gt;
# As of Obsidian 4.5.0, you can provide a delimited list (delimiter is 3 tildes ~~~) of groups to search.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.admin.dn=cn=SchedulerAdmin,ou=groups,o=MyOrgHere&lt;br /&gt;
# No need to alter this&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.admin.roleName=Admin&lt;br /&gt;
&lt;br /&gt;
# Configure the LimitedRead role used in the admin web app, based on LDAP group membership (by default, users may only read)&lt;br /&gt;
# As of Obsidian 4.5.0, you can provide a delimited list (delimiter is 3 tildes ~~~) of groups to search.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.limitedRead.dn=cn=SchedulerLimitedRead,ou=groups,o=MyOrgHere&lt;br /&gt;
# No need to alter this&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.limitedRead.roleName=LimitedRead&lt;br /&gt;
&lt;br /&gt;
# Configure the APIrole used by the REST API, based on LDAP group membership&lt;br /&gt;
# As of Obsidian 4.5.0, you can provide a delimited list (delimiter is 3 tildes ~~~) of groups to search.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.api.dn=cn=SchedulerAPI,ou=groups,o=MyOrgHere&lt;br /&gt;
# No need to alter this&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.api.roleName=API&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OAuth / OIDC Authentication Properties ====&lt;br /&gt;
&lt;br /&gt;
To use OAuth / OIDC SSO, set the &#039;&#039;Authenticator&#039;&#039; property to&lt;br /&gt;
&#039;&#039;com.carfey.suite.security.OAuthAuthenticator&#039;&#039; and add the properties below. All&lt;br /&gt;
properties are prefixed with &#039;&#039;com.carfey.suite.security.OAuthAuthenticator.&#039;&#039; (shown&lt;br /&gt;
without prefix in the table for brevity).&lt;br /&gt;
&lt;br /&gt;
===== Required properties =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Property !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;issuer&#039;&#039; || OIDC Issuer URL. Obsidian fetches &#039;&#039;&amp;lt;issuer&amp;gt;/.well-known/openid-configuration&#039;&#039; lazily on first use and caches it.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;clientId&#039;&#039; || Client ID registered at the IdP.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;clientSecret&#039;&#039; || Client secret. Keep out of version control.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;redirectUri&#039;&#039; || Exact callback URL registered at the IdP (e.g. &#039;&#039;https://app.example.com/oauth/callback&#039;&#039;).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;scopes&#039;&#039; || Space-separated OAuth scopes (e.g. &#039;&#039;openid profile email groups&#039;&#039;). Must include &#039;&#039;openid&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;claim.groups&#039;&#039; || Name of the token claim that carries group memberships (e.g. &#039;&#039;groups&#039;&#039;).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;role.&amp;lt;idx&amp;gt;.group&#039;&#039; || IdP group value for this mapping. &#039;&#039;&amp;lt;idx&amp;gt;&#039;&#039; is an arbitrary stable label (numeric or descriptive).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;role.&amp;lt;idx&amp;gt;.roleName&#039;&#039; || Obsidian role for this mapping. At least one &#039;&#039;Admin&#039;&#039; mapping is required. Valid roles: &#039;&#039;&#039;Admin&#039;&#039;&#039;, &#039;&#039;&#039;API&#039;&#039;&#039;, &#039;&#039;&#039;Write&#039;&#039;&#039;, &#039;&#039;&#039;LimitedRead&#039;&#039;&#039;, &#039;&#039;&#039;Operator&#039;&#039;&#039;, &#039;&#039;&#039;Author&#039;&#039;&#039;, and folder-based roles (&#039;&#039;&amp;lt;folder&amp;gt;-(Write|Author|Operator)&#039;&#039;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Optional properties =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Property !! Default !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;displayName&#039;&#039; || (none) || Label on the SSO button: &amp;quot;Sign in with &#039;&#039;&amp;lt;displayName&amp;gt;&#039;&#039;&amp;quot;. Defaults to &amp;quot;Sign in with SSO&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;logout.mode&#039;&#039; || &#039;&#039;local&#039;&#039; || &#039;&#039;local&#039;&#039;: invalidates Obsidian session only. &#039;&#039;rp&#039;&#039;: RP-initiated logout via IdP &#039;&#039;end_session_endpoint&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;postLogoutRedirectUri&#039;&#039; || (none) || Where to redirect after RP-initiated logout. Ignored when &#039;&#039;logout.mode=local&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;claim.user&#039;&#039; || &#039;&#039;sub&#039;&#039; || Claim used as the internal user ID in audit logs. &#039;&#039;&#039;Strongly recommend keeping as &#039;&#039;sub&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;claim.displayName&#039;&#039; || &#039;&#039;preferred_username&#039;&#039; || Claim shown in the Obsidian UI nav bar. Separate from &#039;&#039;claim.user&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;claim.validateTyp&#039;&#039; || &#039;&#039;true&#039;&#039; || When &#039;&#039;true&#039;&#039;, rejects Bearer tokens where &#039;&#039;typ&#039;&#039; is present but not &#039;&#039;at+JWT&#039;&#039;. Set &#039;&#039;false&#039;&#039; only for legacy IdPs that omit &#039;&#039;typ&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;clockSkewSeconds&#039;&#039; || &#039;&#039;60&#039;&#039; || Clock skew tolerance for &#039;&#039;exp&#039;&#039;/&#039;&#039;nbf&#039;&#039; validation (seconds).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;metadata.ttlHours&#039;&#039; || &#039;&#039;24&#039;&#039; || OIDC discovery document cache TTL in hours.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;expectedAccessTokenAudience&#039;&#039; || &#039;&#039;clientId&#039;&#039; || Expected &#039;&#039;aud&#039;&#039; for Bearer access tokens. See security note below.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;claim.groupsSource&#039;&#039; || &#039;&#039;idtoken&#039;&#039; || Where to read groups during browser SSO: &#039;&#039;idtoken&#039;&#039;, &#039;&#039;accesstoken&#039;&#039;, or &#039;&#039;userinfo&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;claim.groupsBearerSource&#039;&#039; || &#039;&#039;accesstoken&#039;&#039; || Where to read groups on the Bearer path: &#039;&#039;idtoken&#039;&#039; or &#039;&#039;accesstoken&#039;&#039;. &#039;&#039;&#039;userinfo is not permitted on the Bearer path.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;claim.groupsValuePath&#039;&#039; || (none) || Sub-field name when groups is an array of objects (e.g. &#039;&#039;name&#039;&#039;).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;claim.groupsStripPrefix&#039;&#039; || (none) || Prefix to strip from each group value (e.g. &#039;&#039;/&#039;&#039; for Keycloak full-path style).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;claim.groupsUserinfoTimeout&#039;&#039; || &#039;&#039;5&#039;&#039; || HTTP timeout in seconds for the userinfo endpoint. Only used when &#039;&#039;claim.groupsSource=userinfo&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dynamicRole.prefix&#039;&#039; || (none) || Prefix for auto-generated folder-role group mappings. Requires &#039;&#039;dynamicRole.suffix&#039;&#039;. Map is rebuilt at startup; adding a new root folder requires a restart.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dynamicRole.suffix&#039;&#039; || (none) || Suffix for auto-generated folder-role group mappings. Requires &#039;&#039;dynamicRole.prefix&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;requireRole&#039;&#039; || &#039;&#039;true&#039;&#039; || When &#039;&#039;true&#039;&#039;, browser SSO fails if IdP groups map to no Obsidian roles. Does not apply to REST Bearer tokens.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Security notes =====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;expectedAccessTokenAudience and cross-JWT confusion&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When &#039;&#039;expectedAccessTokenAudience&#039;&#039; is not set it defaults to &#039;&#039;clientId&#039;&#039;. In many OIDC&lt;br /&gt;
configurations the id_token also carries &#039;&#039;aud=clientId&#039;&#039;, which could allow an id_token&lt;br /&gt;
to be submitted as a Bearer token. The &#039;&#039;claim.validateTyp=true&#039;&#039; default mitigates this&lt;br /&gt;
for compliant IdPs (access tokens carry &#039;&#039;typ=at+JWT&#039;&#039;; id_tokens carry &#039;&#039;typ=JWT&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
For maximum defence, set &#039;&#039;expectedAccessTokenAudience&#039;&#039; to a distinct resource-server&lt;br /&gt;
identifier if your IdP supports it.&lt;br /&gt;
&lt;br /&gt;
If &#039;&#039;claim.validateTyp=false&#039;&#039; AND &#039;&#039;expectedAccessTokenAudience&#039;&#039; is not explicitly set,&lt;br /&gt;
Obsidian logs a mandatory startup WARN advising you to set &#039;&#039;expectedAccessTokenAudience&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===== Keycloak example =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
com.carfey.suite.security.Authenticator=com.carfey.suite.security.OAuthAuthenticator&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.issuer=http://localhost:8081/realms/obsidian&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.clientId=obsidian-client&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.clientSecret=test-client-secret-local&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.redirectUri=http://localhost:8080/oauth/callback&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.scopes=openid profile email groups&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.claim.groups=groups&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.claim.groupsSource=idtoken&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.role.1.group=Obsidian-Admins&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.role.1.roleName=Admin&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.role.2.group=Obsidian-Write&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.role.2.roleName=Write&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.role.3.group=Obsidian-Read&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.role.3.roleName=LimitedRead&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.role.4.group=Obsidian-API&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.role.4.roleName=API&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.displayName=Keycloak&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.logout.mode=local&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.requireRole=true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Provider notes =====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Microsoft Entra ID&#039;&#039;&#039;: groups claim contains GUIDs by default; configure Optional&lt;br /&gt;
Claims for display names. Accounts with 200+ groups trigger overage. Multi-tenant apps not&lt;br /&gt;
supported in v1.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Auth0&#039;&#039;&#039;: opaque access tokens (Auth0 default) are not supported on the Bearer path.&lt;br /&gt;
Configure a custom API audience to get JWT access tokens.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Okta&#039;&#039;&#039;: use the Custom Authorization Server URL, not the Org Authorization Server.&lt;br /&gt;
&lt;br /&gt;
===== v1 limitations =====&lt;br /&gt;
&lt;br /&gt;
* Opaque access tokens not supported on the REST/Bearer path.&lt;br /&gt;
* No &#039;&#039;jti&#039;&#039; replay protection.&lt;br /&gt;
* Microsoft Entra multi-tenant apps not supported.&lt;br /&gt;
* No post-login IdP session validity check.&lt;br /&gt;
* Dynamic role map requires restart for new root folders.&lt;br /&gt;
* Installer UI supports up to 10 static role pairs; runtime supports unlimited.&lt;br /&gt;
&lt;br /&gt;
=== SMTP Mail Properties ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Email configuration for notifications, if desired&lt;br /&gt;
#for straight up open relay, just specify the host using&lt;br /&gt;
mail.smtp.host=smtp.myopenrelayhost.com&lt;br /&gt;
mail.smtp.port=port &lt;br /&gt;
#(standard ports are 25, 465 for SSL, 587 for TLS)&lt;br /&gt;
&lt;br /&gt;
#for using TLS and SSL, provide these as necessary&lt;br /&gt;
mail.smtp.socketFactory.port=port&lt;br /&gt;
mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory&lt;br /&gt;
mail.smtp.auth=true&lt;br /&gt;
mail.smtp.user=myauthenticatedemailuser@email.com&lt;br /&gt;
mail.smtp.password=PASSWORD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# As of Obsidian 2.5.0, we support JNDI lookups for email sessions. All other email properties can be excluded.&lt;br /&gt;
mail.session.jndi.path=java:comp/env/mail/session&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Database Properties ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Database configuration&lt;br /&gt;
com.carfey.obsidian.db.url=jdbc:mysql://localhost/obsidian&lt;br /&gt;
com.carfey.obsidian.db.userId=user&lt;br /&gt;
com.carfey.obsidian.db.password=pass&lt;br /&gt;
&lt;br /&gt;
# Sample JDBC URL formats for all platforms&lt;br /&gt;
#com.carfey.obsidian.db.url=jdbc:mysql://localhost:3306/obsidian&lt;br /&gt;
#com.carfey.obsidian.db.url=jdbc:h2:C:/dev/workspace/obsidian;MVCC=TRUE&lt;br /&gt;
#com.carfey.obsidian.db.url=jdbc:oracle:thin:@localhost:1521:obsidian&lt;br /&gt;
#com.carfey.obsidian.db.url=jdbc:postgresql://localhost:5432/obsidian&lt;br /&gt;
#com.carfey.obsidian.db.url=jdbc:sqlserver://localhost:1433;databaseName=obsidian&lt;br /&gt;
&lt;br /&gt;
# As of Obsidian 6.3.0, we support constructing simple JDBC urls from component properties&lt;br /&gt;
# Only supports basic URL formats noted above and does not support H2&lt;br /&gt;
#com.carfey.obsidian.db.host=localhost&lt;br /&gt;
#com.carfey.obsidian.db.port=3306&lt;br /&gt;
#com.carfey.obsidian.db.databaseName=obsidianDB&lt;br /&gt;
#com.carfey.obsidian.db.dbType=mariadb/mysql/oracle/postgresql/sqlserver&lt;br /&gt;
#com.carfey.obsidian.db.oracleSid=SIDORCL&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
# As of Obsidian 2.5.0, we support JNDI lookups for database connectivity.&lt;br /&gt;
com.carfey.obsidian.db.url=java:comp/env/jdbc/obsidian&lt;br /&gt;
com.carfey.obsidian.db.jndiType=mysql&lt;br /&gt;
#com.carfey.obsidian.db.jndiType=mysql is also used for MariaDB&lt;br /&gt;
#com.carfey.obsidian.db.jndiType=oracle&lt;br /&gt;
#com.carfey.obsidian.db.jndiType=postgresql&lt;br /&gt;
#com.carfey.obsidian.db.jndiType=h2&lt;br /&gt;
#com.carfey.obsidian.db.jndiType=sqlserver&lt;br /&gt;
&lt;br /&gt;
# Table prefix may be used to add a prefix to tables and related database objects. It must be 6 or fewer characters and can contain letters or underscores. Available as of version 2.0.&lt;br /&gt;
com.carfey.obsidian.db.tablePrefix=OBSDN_&lt;br /&gt;
&lt;br /&gt;
# For Oracle databases, when Obsidian&#039;s tables exist in a different schema from the user specified above, or if the user does not default to the schema matching its name, specify the target schema here. Available as of version 2.1.&lt;br /&gt;
# For details on the required privileges to run with an alternate user, see https://wiki.obsidianscheduler.com/docs/Obsidian_Tables#Oracle_Privileges&lt;br /&gt;
# This same configuration item can be used to configure the Postgresql schema. If unspecified, the default is public. Available as of Obsidian 2.1.1. &lt;br /&gt;
# If using JNDI and Oracle/Postgresql, we recommend you set this value to ensure best performance.&lt;br /&gt;
com.carfey.obsidian.db.schema=obsidian&lt;br /&gt;
&lt;br /&gt;
#default max connections per pool if not specified is 50&lt;br /&gt;
com.carfey.obsidian.db.maxConnections=40&lt;br /&gt;
&lt;br /&gt;
#default millis timeout to retrieve available connection from pool if not specified is 2000&lt;br /&gt;
com.carfey.obsidian.db.connectionTimeout=2000&lt;br /&gt;
&lt;br /&gt;
# As of 3.4.0, you can disable pooling of connections, which is suggested only if using another connection pool through JNDI. When true, maxConnections is ignored. &lt;br /&gt;
# When a JNDI data source is selected in the installer, this is set to true by default.&lt;br /&gt;
com.carfey.obsidian.db.disablePooling=true&lt;br /&gt;
&lt;br /&gt;
# As of 4.3.0, Oracle database supports configured wait time.&lt;br /&gt;
com.carfey.obsidian.db.timedLockWaitEnabled=true (default)&lt;br /&gt;
com.carfey.obsidian.db.timedLockWaitSeconds=1 (default, prior to 4.3.0, indefinite wait)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Logging Properties ===&lt;br /&gt;
As of &#039;&#039;&#039;Obsidian 5.0.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Please see [https://logging.apache.org/log4j/2.x/manual/configuration.html Log4j2 configuration]&lt;br /&gt;
&lt;br /&gt;
Before &#039;&#039;&#039;Obsidian 5.0.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Please see [https://logging.apache.org/log4j/1.2/manual.html Log4j Configuration]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Miscellaneous Properties ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# If you wish to change the tokens used to reference global parameters in your job configuration, use the following two values:&lt;br /&gt;
global.param.start.token={{&lt;br /&gt;
global.param.end.token=}}&lt;br /&gt;
&lt;br /&gt;
# Populated by the installer, these values can be used to initialize licence key information into the database.&lt;br /&gt;
com.carfey.obsidian.licence.key=licenceKey&lt;br /&gt;
# Name is only required for hardware-linked or site licenses. Use the name exactly as provided by Carfey Software Corporation in your license email.&lt;br /&gt;
com.carfey.obsidian.licence.name=licenceeName&lt;br /&gt;
&lt;br /&gt;
# As of 2.8.0, if you have issues with classloading (e.g. in Grails or Spring), this flag enables usage of the context classloader .&lt;br /&gt;
com.carfey.jdk.useContextClassLoader=true&lt;br /&gt;
&lt;br /&gt;
# As of 2.9.0, you can set the scheduler host designator name multiple times in the same JVM by using this parameter:&lt;br /&gt;
com.carfey.obsidian.schedulerDesignation=obsidian-dev&lt;br /&gt;
&lt;br /&gt;
# As of 3.0.0, Job Forking can be enabled and configured per node&lt;br /&gt;
com.carfey.obsidian.jvmJobForkingEnabledOnThisNode=true&lt;br /&gt;
# This property is the location of the fork scripts. Obsidian is bundled with obsidianForkedJob.bat and obsidianForkedJob.sh. These are the expected script names.&lt;br /&gt;
com.carfey.obsidian.forkedJobScriptLocation=/Obsidian-3.0.0&lt;br /&gt;
# Use the following optional property if you need to override the default classpath that is built using the contents of the standalone directory.&lt;br /&gt;
# This allows for job forking support in embedded and even webapp deployments. Use the classpath format supported by your operating system.&lt;br /&gt;
#com.carfey.obsidian.forkedJobscriptClasspathOverride=&lt;br /&gt;
# Use the following optional property if you wish to include database configuration parameters as arguments passed to the forking scripts and the target forked Obsidian class.&lt;br /&gt;
# For example, you may need to do this if your configuration is done via System Property overrides or programmmatically in your embedded Obsidian instance.&lt;br /&gt;
#com.carfey.obsidian.jvmJobForkingIncludeDbSysParms=true&lt;br /&gt;
&lt;br /&gt;
# Obsolete as of 4.0.0. As of 3.4.0, the base URL used to resolve links in the Obsidian web app can be overridden. This is typically only required when a load balancer or proxy is used to access Obsidian.&lt;br /&gt;
com.carfey.obsidian.baseHrefUrl=http://myhost:8080/obsidian&lt;br /&gt;
&lt;br /&gt;
# As of 4.3.0, description/parameter formatting is supported. Custom formatter (com.carfey.ops.job.config.formatter.Formatter) supported via this parameter.&lt;br /&gt;
com.carfey.obsidian.formatterClass=com.carfey.ops.job.config.formatter.MarkdownFormatter (default)&lt;br /&gt;
&lt;br /&gt;
# As of 4.4.0, support for running DDL outside Obsidian and applying only the data portion of upgrades. May require incremental upgrades. Contact support for assistance. Enabled with the following:&lt;br /&gt;
com.carfey.obsidian.runner.skipDDL=true&lt;br /&gt;
&lt;br /&gt;
# As of 4.5.0, Slack notifications can be automatically configured for FATAL, ERROR and WARN events by setting this property with a Slack incoming web hook URL. The user name property is optional and defaults to Obsidian Scheduler&lt;br /&gt;
com.carfey.obsidian.slack.webhookUrl=https://hooks.slack.com/services/XXXXXXX/YYYYYYYY/ZZZZZZZZZZ&lt;br /&gt;
com.carfey.obsidian.slack.userName=Obsidian Scheduler (prod)&lt;br /&gt;
&lt;br /&gt;
# As of 4.6.0, Obsidian supports starting a node in paused state. This can also be set as a System property.&lt;br /&gt;
com.carfey.obsidian.schedulerPausedOnStartup=true&lt;br /&gt;
&lt;br /&gt;
# As of 4.10.0, Obsidian supports disabling script engine jobs selectively.&lt;br /&gt;
com.carfey.ops.job.script.BeanShellJob.enabled=true&lt;br /&gt;
com.carfey.ops.job.script.GroovyJob.enabled=true&lt;br /&gt;
com.carfey.ops.job.script.RubyJob.enabled=true&lt;br /&gt;
com.carfey.ops.job.script.PythonJob.enabled=true&lt;br /&gt;
com.carfey.ops.job.script.JavaScriptJob.enabled=true&lt;br /&gt;
&lt;br /&gt;
# As of 5.0.0, Signal interrupt (supported as of 4.5.1) is disabled by default. Use configuration to enable.&lt;br /&gt;
com.carfey.obsidian.signalHandlerActiveForScheduler=true&lt;br /&gt;
&lt;br /&gt;
# As of 5.2.0, you can send Obsidian events to a REST endpoint via an out-of-the-box Event Hook. The basicAuthorization property is optional, the sample showing its use for myusername:mypassword. The &amp;quot;Basic &amp;quot; prefix is added by Obsidian.&lt;br /&gt;
com.carfey.obsidian.restfulEventHook.url=https://myendpoint.com:1234/rest/obsidian_events&lt;br /&gt;
com.carfey.obsidian.restfulEventHook.basicAuthorization=bXl1c2VybmFtZTpteXBhc3N3b3Jk&lt;br /&gt;
&lt;br /&gt;
# As of 5.2.1, maintenance jobs are automatically scheduled for new installations. Set the following property to disable this behaviour.&lt;br /&gt;
com.carfey.obsidian.skipMaintenanceJobInitialization=true&lt;br /&gt;
&lt;br /&gt;
# As of 5.2.1, you can send Obsidian events to standard output and error streams using an out-of-the-box Event Hook. You can enable the default behaviour and auto-register it by adding the following configuration.&lt;br /&gt;
com.carfey.obsidian.standardOutputStreamsEventHook.enabled=true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Table Prefixes ===&lt;br /&gt;
As shown in full configuration reference, a table name prefix may be specified to create Obsidian tables with names beginning with a specified string.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Table prefix may be used to add a prefix to tables and related database objects. It must be 6 or fewer characters and can contain letters or underscores. Available as of version 2.0.&lt;br /&gt;
com.carfey.obsidian.db.tablePrefix=OBSDN_&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Properties/Yaml File ==&lt;br /&gt;
&lt;br /&gt;
The above configuration must reside in a properties file named &amp;lt;code&amp;gt;com.carfey.properties&amp;lt;/code&amp;gt; or a yaml file named &amp;lt;code&amp;gt;com.carfey.yaml&amp;lt;/code&amp;gt; found according to the rules of [http://docs.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html#getResource(java.lang.String) ClassLoader.getResource].  If both yaml and properties files are found, yaml is loaded first and properties values will override. Some possibilities include &amp;lt;code&amp;gt;WEB-INF/classes/com.carfey.(properties/yaml)&amp;lt;/code&amp;gt;, a &amp;lt;code&amp;gt;com.carfey.(properties/yaml)&amp;lt;/code&amp;gt; file in a directory which is explicitly added to the classpath, or at the root of a jar file as is done in &amp;lt;code&amp;gt;obsidian-props.jar&amp;lt;/code&amp;gt; for standalone deployments. Prior to Obsidian 3.6, this file had to exist on the classpath, even if only using the override options below to configure Obsidian.&lt;br /&gt;
&lt;br /&gt;
Instead of using a classpath resource for properties, you can specify an external properties file using the Java system property &amp;lt;code&amp;gt;carfey.properties.file&amp;lt;/code&amp;gt;. All expected properties must be specified in either the default &amp;lt;code&amp;gt;com.carfey.properties&amp;lt;/code&amp;gt; file on the classpath or in the override file. Any properties found in both files will use the override file&#039;s values. Usage: &amp;lt;code&amp;gt;-Dcarfey.properties.file=/home/obsidian/obsidian.properties&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Instead of using a classpath resource for yaml, you can specify an external yaml file using the Java system property &amp;lt;code&amp;gt;carfey.yaml.file&amp;lt;/code&amp;gt;. All expected configuration values must be specified in either the default &amp;lt;code&amp;gt;com.carfey.yaml&amp;lt;/code&amp;gt; file on the classpath or in the override file. Any configuration values found in both files will use the override file&#039;s values. Usage: &amp;lt;code&amp;gt;-Dcarfey.yaml.file=/home/obsidian/obsidian.yaml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
As of Obsidian 2.1, you may also use a programmatic properties override. Simply call &amp;lt;code&amp;gt;com.carfey.jdk.sys.Configurator.setOverride(Properties props)&amp;lt;/code&amp;gt; as early as possible in the application startup.  To quote the javadoc of this method, &#039;&#039;For use as a programmatic properties override. This must be called before any classes are accessed either through invocation or class initialization that may require access to configuration done through properties. Best if done as early as possible in code, perhaps first in an entry point class that does little else and then hands-off to existing entry point.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
As of Obsidian 4.4, you may specify configuration values as System Properties or Environment Variables. Duplicated values are resolved as follows:&lt;br /&gt;
# System Property&lt;br /&gt;
# Environment Variable - &#039;&#039;&#039;&#039;&#039;overridden by System Property&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
# Properties - &#039;&#039;&#039;&#039;&#039;overridden by Environment Variable and System Property&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Notifications Configuration ==&lt;br /&gt;
&lt;br /&gt;
Sending notifications requires SMTP configuration to be defined in the Obsidian properties file. The properties file reference at the beginning of this page includes SMTP configuration details.&lt;br /&gt;
&lt;br /&gt;
In addition to the properties file, you can configure some Notifications settings to tweak how your emails are sent. These values are configurable under the &#039;&#039;Dispatch&#039;&#039; category of the [[Admin Scheduler Settings|scheduler settings]] screen. Defaults are provided, but you can update them appropriately for your needs.  &lt;br /&gt;
&lt;br /&gt;
[[File:NotifSettings_4.0.png]]&lt;br /&gt;
&lt;br /&gt;
== Dependent Libraries ==&lt;br /&gt;
&lt;br /&gt;
Obsidian Scheduler requires a number of third party libraries, both for the web administration application and the scheduler itself.  Below is information on these libraries and how they are used.  Unless otherwise noted, they are mandatory. As of Obsidian 2.5.0, our installer supports selective [[Installation_Guide#Configuring_3rd_Party_Library_Conflict_Management|conflict management]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Authentication (OAuth / OIDC)&#039;&#039;&lt;br /&gt;
All libraries in this section are only required when OAuthAuthenticator is active. &#039;&#039;&#039;As of Obsidian 7.0.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* oauth2-oidc-sdk-11.23.1.jar, nimbus-jose-jwt-10.0.2.jar. Nimbus OAuth 2.0 SDK with OpenID Connect extensions and JOSE+JWT support.&lt;br /&gt;
* content-type-2.3.jar, lang-tag-1.7.jar. Supporting libraries for the Nimbus SDK.&lt;br /&gt;
* json-smart-2.5.2.jar, accessors-smart-2.5.2.jar. JSON parsing for the Nimbus SDK.&lt;br /&gt;
* jcip-annotations-1.0-1.jar. Concurrency annotations for the Nimbus SDK.&lt;br /&gt;
* asm-9.7.1.jar. Bytecode manipulation library; transitive dependency of the Nimbus SDK.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Embedded Tomcat (Obsidian Embedded Tomcat JAR packs only)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* tomcat-embed-core-10.1.39.jar, tomcat-embed-el-10.1.39.jar — Apache Tomcat embedded components (Apache License 2.0). Present in &#039;&#039;&#039;embed-tomcat-lib/&#039;&#039;&#039; when an Embedded Tomcat pack is selected.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Common&#039;&#039;&lt;br /&gt;
* obsidian.jar.  Core Obsidian lib.&lt;br /&gt;
* gson-2.10.1. Supports REST API and web administration.&lt;br /&gt;
* jmustache-1.15.jar. Provides email templating.&lt;br /&gt;
* log4j-api-2.17.0.jar, log4j-core-2.17.0.jar.  Obsidian logging uses log4j2.&lt;br /&gt;
* snakeyaml-2.3.jar. Support for YAML configuration.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Databases&#039;&#039;&lt;br /&gt;
* h2-1.4.200.jar.  H2 database and JDBC driver.  Only required for running H2.&lt;br /&gt;
* mariadb-java-client-2.7.2.jar. MySQL JDBC driver. Only required for running against MySQL or MariaDB.&lt;br /&gt;
* mssql-jdbc-9.2.1.jre11.jar. SQL Server JDBC driver.  Only required for running SQLServer.&lt;br /&gt;
* ojdbc11-21.1.0.0.jar. Oracle JDBC driver.  Only required for running Oracle.&lt;br /&gt;
* postgresql-42.2.19.jar.  PostgreSQL JDBC driver.  Only required for running PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Mail&#039;&#039; &lt;br /&gt;
* activation-1.1.jar, javax.mail-1.6.2.jar. Used for javamail (javax) email notifications.&lt;br /&gt;
* angus-activation-2.0.1.jar, angus-mail-2.0.2.jar. Optionally used with Jakarta EE email notifications.&lt;br /&gt;
* jakarta.activation-api-2.1.2.jar, jakarta.mail-api-2.1.2.jar. Used for Jakarta EE email notifications.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Scripts&#039;&#039;&lt;br /&gt;
* bsh-2.0b5.jar.  Support for our Bean Shell script execution. (http://www.beanshell.org).  Only required for BeanShellJob usage.&lt;br /&gt;
* jruby-9.2.17.0.jar. Support for Ruby script execution (https://www.jruby.org/). Only required for RubyJob usage.&lt;br /&gt;
* jython-standalone-2.7.2.jar. Support for Python script execution (https://www.jython.org/).  Only required for PythonJob usage.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Scripts - Prior to Obsidian 7.0.0:&#039;&#039;&#039;&lt;br /&gt;
Groovy scripting shipped as a single uber archive: apache-groovy-all-4.0.24.jar&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Scripts - As of Obsidian 7.0.0:&#039;&#039;&#039;&lt;br /&gt;
Groovy scripting ships as 13 modular JARs: groovy-4.0.24.jar, groovy-astbuilder-4.0.24.jar, groovy-datetime-4.0.24.jar, groovy-dateutil-4.0.24.jar, groovy-json-4.0.24.jar, groovy-jsr223-4.0.24.jar, groovy-macro-4.0.24.jar, groovy-macro-library-4.0.24.jar, groovy-nio-4.0.24.jar, groovy-sql-4.0.24.jar, groovy-templates-4.0.24.jar, groovy-typecheckers-4.0.24.jar, groovy-xml-4.0.24.jar.&lt;br /&gt;
Plus four owned transitives (included when Groovy is enabled): asm-analysis-9.7.1.jar, asm-tree-9.7.1.jar, asm-util-9.7.1.jar, javaparser-core-3.26.2.jar&lt;br /&gt;
All 17 JARs above are excluded when Groovy scripting is disabled at install time.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Web Admin&#039;&#039;&lt;br /&gt;
* dom4j-2.1.3.jar.  XML utilities.&lt;br /&gt;
* flexmark-0.62.2.jar, flexmark-util-0.62.2.jar. Markdown formatting for Description and Parameter job annotations.&lt;br /&gt;
* jxl-2.6.12.jar. Excel file format utilities. Only required in web administration.&lt;br /&gt;
* opencsv-5.4.jar. Support for CSV downloads in UI.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Web Admin - As of Obsidian 7.0.0:&#039;&#039;&#039;&lt;br /&gt;
Wiki rendering ships as 12 modular JARs:&lt;br /&gt;
flexmark-0.62.2.jar, flexmark-util-ast-0.62.2.jar, flexmark-util-builder-0.62.2.jar, flexmark-util-collection-0.62.2.jar, flexmark-util-data-0.62.2.jar, flexmark-util-dependency-0.62.2.jar, flexmark-util-format-0.62.2.jar, flexmark-util-html-0.62.2.jar, flexmark-util-misc-0.62.2.jar, flexmark-util-options-0.62.2.jar, flexmark-util-sequence-0.62.2.jar, flexmark-util-visitor-0.62.2.jar&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;As of Obsidian 7.0.0&#039;&#039;&#039;, the following changes were made:&lt;br /&gt;
* &#039;&#039;&#039;log4j upgraded&#039;&#039;&#039;: log4j-api and log4j-core updated from 2.17.1 to 2.26.0.&lt;br /&gt;
* &#039;&#039;&#039;Modular Groovy libraries&#039;&#039;&#039;: Obsidian no longer ships &#039;&#039;&#039;apache-groovy-all-4.0.24.jar&#039;&#039;&#039;. Groovy scripting now uses 13 modular JARs (see &#039;&#039;Scripts&#039;&#039; above). When Groovy is disabled at install time, all 13 modules are excluded.&lt;br /&gt;
* &#039;&#039;&#039;Modular Flexmark libraries&#039;&#039;&#039;: Obsidian no longer ships &#039;&#039;&#039;flexmark-util-0.62.2.jar&#039;&#039;&#039;. Wiki rendering now uses 12 modular Flexmark JARs (see &#039;&#039;Scripts&#039;&#039; above). &lt;br /&gt;
* &#039;&#039;&#039;OAuth / OIDC authentication libraries&#039;&#039;&#039; added (Nimbus OAuth 2.0 SDK and transitive dependencies). Required only when OAuthAuthenticator is configured. See [[Advanced_Configuration#OAuth_/_OIDC_Authentication_Properties|Authentication (OAuth/OIDC)]] above.&lt;br /&gt;
* Embedded Tomcat runtime added (tomcat-embed-core-10.1.39.jar, tomcat-embed-el-10.1.39.jar). Present only when an Embedded Tomcat pack is selected. Replaces the Jetty quick-start distribution which has been removed.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 6.0.0&#039;&#039;&#039;, the following library was in use.&lt;br /&gt;
* groovy-all-3.0.7.jar. Support for Groovy script execution (https://groovy-lang.org/).  Only required for GroovyJob usage.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 5.4.0&#039;&#039;&#039;, the following library was in use.&lt;br /&gt;
* gson-2.8.6.jar. Supports REST API and web administration.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 5.2.0&#039;&#039;&#039;, the following library was in use.&lt;br /&gt;
* jakarta.activation-1.2.1.jar. Used for email notifications.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 5.0.3&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* &#039;&#039;Obsidian 5.0.2&#039;&#039; log4j-api-2.16.0.jar, log4j-core-2.16.0.jar.  &lt;br /&gt;
* &#039;&#039;Obsidian 5.0.1&#039;&#039; log4j-api-2.15.0.jar, log4j-core-2.15.0.jar.  &lt;br /&gt;
* &#039;&#039;Obsidian 5.0.0&#039;&#039; log4j-api-2.14.1.jar, log4j-core-2.14.1.jar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 5.0.0&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* activation-1.1.jar, javax.mail-1.5.5.jar.  Used for email notifications.&lt;br /&gt;
* dom4j-1.6.1.jar. XML utilities.&lt;br /&gt;
* gson-2.7.jar. Supports REST API and web administration.&lt;br /&gt;
* bsh-2.0b4.jar.  Support for our Bean Shell script execution. (http://www.beanshell.org).  Only required for BeanShellJob usage.&lt;br /&gt;
* groovy-all-2.4.14.jar. Support for Groovy script execution (https://groovy-lang.org/).  Only required for GroovyJob usage.&lt;br /&gt;
* jython-standalone-2.7.0.jar. Support for Python script execution (https://www.jython.org/).  Only required for PythonJob usage.&lt;br /&gt;
* jruby-complete-9.2.7.0.jar. Support for Ruby script execution (https://www.jruby.org/). Only required for RubyJob usage.&lt;br /&gt;
* jmustache-1.12.jar. Provides email templating.&lt;br /&gt;
* h2-1.4.192.  H2 database and JDBC driver.  Only required for running H2.&lt;br /&gt;
* log4j-1.2.9.jar.  Obsidian logging uses log4j.&lt;br /&gt;
* mariadb-java-client-1.4.5.jar.  MySQL JDBC driver. Only required for running against MySQL or MariaDB.&lt;br /&gt;
* jtds-1.3.1.jar. SQL Server JDBC driver.  Only required for running SQLServer.&lt;br /&gt;
* ojdbc7-12.1.0.1.jar.  Oracle JDBC driver.  Only required for running Oracle.&lt;br /&gt;
* postgresql-9.4.1208.jre7.jar. PostgreSQL JDBC driver.  Only required for running PostgreSQL.&lt;br /&gt;
* opencsv-3.8.jar. Support for CSV downloads in UI.&lt;br /&gt;
* flexmark-0.19.6.jar, flexmark-util-0.19.6.jar (as of 4.3.0). Markdown formatting for Description and Parameter job annotations.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 4.5.1&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* groovy-all-2.4.7.jar. Support for Groovy script execution (https://groovy-lang.org/).  Only required for GroovyJob usage.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 4.0.0&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* javax.mail-1.5.2.jar.  Used for email notifications.&lt;br /&gt;
* jstl.jar, standard.jar.  Web utilities. Only required in web administration.&lt;br /&gt;
* gson-2.2.2.jar. Supports REST API and web administration.&lt;br /&gt;
* groovy-all-2.1.8.jar.  Support for Groovy script execution (https://groovy-lang.org/).  Only required for GroovyJob usage.&lt;br /&gt;
* jython-standalone-2.5.3.jar.  Support for Python script execution (https://www.jython.org/).  Only required for PythonJob usage.&lt;br /&gt;
* jmustache-1.8.jar. Provides email templating.&lt;br /&gt;
* h2-1.3.154. H2 database and JDBC driver.  Only required for running H2.&lt;br /&gt;
* mariadb-java-client-1.1.5.jar. MySQL JDBC driver. Only required for running against MySQL or MariaDB.&lt;br /&gt;
* jtds-1.2.8.jar. SQL Server JDBC driver.  Only required for running SQLServer.&lt;br /&gt;
* ojdbc6-11.2.0.3.jar. Oracle JDBC driver.  Only required for running Oracle.&lt;br /&gt;
* postgresql-9.0-801.jdbc4.jar.  PostgreSQL JDBC driver.  Only required for running PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 2.9.1&#039;&#039;&#039;, the following redundant library was in included in the Obsidian packaging.&lt;br /&gt;
* smtp.jar.  Used for email notifications.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 2.2.0&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* groovy-all-1.7.6.jar&lt;br /&gt;
* jython.jar (version 2.5.2rc2)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 2.1.1&#039;&#039;&#039;, the following libraries were also included.&lt;br /&gt;
* carfey-date-1.2.jar or carfey-date-1.1.jar.  Date math/manipulation.&lt;br /&gt;
* jdk-gen.jar, jdk.jar, suite-gen.jar, suite.jar.  Core Obsidian libs.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 2.1.0&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* ojdbc14.jar Oracle JDBC driver.  Only required for running Oracle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 1.5&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* gson-1.5.jar. Supports REST API and web administration.&lt;br /&gt;
&lt;br /&gt;
=== Required Libraries for Embedded API ===&lt;br /&gt;
&lt;br /&gt;
To use the [[Embedded_API|Embedded API]], the following resources should be imported. If you have newer versions of the same JARs in your application, feel free to use the newer version. The JAR files below can generally be found in the &#039;&#039;standalone&#039;&#039; directory if your installation. The &amp;lt;code&amp;gt;com.carfey.properties&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;com.carfey.yaml&amp;lt;/code&amp;gt; file can be extracted from the &amp;lt;code&amp;gt;obsidian-properties-configuration.jar&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;obsidian-yaml-configuration.jar&amp;lt;/code&amp;gt; in the &#039;&#039;standalone&#039;&#039; directory, or from an Obsidian WAR file under &amp;lt;code&amp;gt;WEB-INF/classes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* com.carfey.properties/com.carfey.yaml (configuration file), or obsidian-properties-configuration.jar/obsidian-yaml-configuration.jar, which contains the configuration file&lt;br /&gt;
* obsidian.jar&lt;br /&gt;
* dom4j-2.1.3.jar&lt;br /&gt;
* flexmark-0.62.2.jar, flexmark-util-0.62.2.jar&lt;br /&gt;
* gson-2.10.1&lt;br /&gt;
* log4j-api-2.17.0.jar, log4j-core-2.17.0.jar&lt;br /&gt;
* Appropriate JDBC JAR (e.g. mariadb-java-client-2.7.2.jar for MySQL or MariaDB)&lt;br /&gt;
&lt;br /&gt;
In addition, the following resources should be included if you wish to have notification support enabled when using the API:&lt;br /&gt;
* jmustache-1.15.jar&lt;br /&gt;
** jakarta.activation-api-2.1.2.jar, jakarta.mail-api-2.1.2.jar. Used for Jakarta EE email notifications.&lt;br /&gt;
** angus-activation-2.0.1.jar, angus-mail-2.0.2.jar. Optionally used with Jakarta EE email notifications.&lt;br /&gt;
** activation-1.1.jar, javax.mail-1.6.2.jar. Used for javamail (javax) email notifications.&lt;br /&gt;
&lt;br /&gt;
Finally, if you need to configure scripting jobs from the API, you will need to include any applicable JARs from the following list:&lt;br /&gt;
* apache-groovy-all-4.0.24.jar&lt;br /&gt;
* bsh-2.0b5.jar&lt;br /&gt;
* jruby-9.2.17.0.jar&lt;br /&gt;
* jython-standalone-2.7.2.jar&lt;br /&gt;
&lt;br /&gt;
== Disabling Job Execution &amp;amp; Scheduling in the Web Application ==&lt;br /&gt;
See the instructions within the [[Getting_Started#Disabling_Job_Scheduling_in_the_Web_Application|Getting Started Guide]].&lt;br /&gt;
&lt;br /&gt;
== Disabling Automatic Database Updates ==&lt;br /&gt;
See the instructions within the [[Getting_Started#Disabling_Automatic_Database_Updates|Getting Started Guide]].&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Upgrading_Obsidian&amp;diff=4096</id>
		<title>Upgrading Obsidian</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Upgrading_Obsidian&amp;diff=4096"/>
		<updated>2026-07-09T20:53:56Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are a number of options available to you. Select the one that best suits your situation.&lt;br /&gt;
&lt;br /&gt;
Note that you don&#039;t necessarily need to go through the installer UI again, although you&#039;re free to do so. Since the primary purpose of the installer is to provide fully configured Obsidian artifacts and your environment would already be configured, you really just need the updated artifacts (libraries and WAR files). Even if you want to take advantage of new configuration options, you could use the [[Advanced_Configuration|Configuration Reference]] to make the necessary changes.&lt;br /&gt;
&lt;br /&gt;
=== Upgrading to 7.0.0 ===&lt;br /&gt;
&lt;br /&gt;
==== Remember Me removal ====&lt;br /&gt;
&lt;br /&gt;
The Remember Me feature has been removed. No operator action is required. On first startup after the upgrade, &#039;&#039;Release7Dot0Dot0Upgrader&#039;&#039; runs automatically and drops the &#039;&#039;USER_COOKIE&#039;&#039; table (if it exists) and removes the &#039;&#039;allowRememberMe&#039;&#039; system parameter. Users who had active Remember Me sessions will be prompted to log in on their next visit.&lt;br /&gt;
&lt;br /&gt;
==== OAuth / OIDC authentication (optional) ====&lt;br /&gt;
&lt;br /&gt;
Obsidian 7.0.0 adds an optional OAuth / OIDC authenticator. Existing installations continue to use their current authenticator (DB or LDAP) with no changes required. To switch to OAuth / OIDC: configure &#039;&#039;OAuthAuthenticator&#039;&#039; properties in the Obsidian configuration file (&#039;&#039;com.carfey.properties&#039;&#039; or YAML equivalent) — see [[Authenticator#OAuthAuthenticator_(OIDC_SSO)]] and [[Advanced_Configuration#OAuth_/_OIDC_Authentication_Properties]] — then restart Obsidian.&lt;br /&gt;
&lt;br /&gt;
==== Migrating saved automated install XML (Obsidian 6 → 7) ====&lt;br /&gt;
&lt;br /&gt;
If you use headless / automated install with an XML file saved from Obsidian 6 (IzPack 4.3.5), you must migrate that file before installing with Obsidian 7. Unzip the Obsidian 7.0.0 download and run the migrate helper (Windows: &#039;&#039;&#039;migrate-headless.bat --in my-old-config.xml --out my-config-izpack5.xml&#039;&#039;&#039;, Unix: &#039;&#039;&#039;migrate-headless.sh&#039;&#039;&#039; with the same arguments, or &#039;&#039;&#039;java -jar Obsidian-Install-Migrate.jar --in my-old-config.xml --out my-config-izpack5.xml&#039;&#039;&#039;). Review &#039;&#039;&#039;my-config-izpack5.xml.migration-report.txt&#039;&#039;&#039; only if the tool creates one — if it lists unknown panels or keys, contact [[Contact_the_Obsidian_Scheduler_Team|Carfey support]]. Then install with the migrated file: &#039;&#039;&#039;java -jar Obsidian-Install-7.0.0.jar my-config-izpack5.xml&#039;&#039;&#039;. The migrate helper covers Obsidian&#039;s standard installer panels only and does not modify product installer descriptors or custom installers.&lt;br /&gt;
&lt;br /&gt;
==== Upgrading evaluation installs (Jetty quick start → embedded Tomcat) ====&lt;br /&gt;
&lt;br /&gt;
Obsidian 7.0.0 removes the Jetty quick-start pack and &#039;&#039;&#039;jetty-home&#039;&#039;&#039; distribution. If you previously installed with a Jetty-based quick start or embedded Jetty pack:&lt;br /&gt;
&lt;br /&gt;
# Re-run the installer or edit your automated install XML to select &#039;&#039;&#039;Obsidian Embedded Tomcat JAR&#039;&#039;&#039; (scheduler) or &#039;&#039;&#039;Obsidian Standalone Admin Embedded Tomcat JAR&#039;&#039;&#039; (admin), &#039;&#039;&#039;and&#039;&#039;&#039; the matching WAR pack.&lt;br /&gt;
# Remove references to legacy Jetty pack names in any saved automated install XML. If the file is still IzPack 4 format, run the migrate helper first (see [[Upgrading_Obsidian#Migrating_saved_automated_install_XML_.28Obsidian_6_.E2.86.92_7.29|Migrating saved automated install XML]]).&lt;br /&gt;
# After install, use &#039;&#039;&#039;webObsidian start scheduler&#039;&#039;&#039; (or &#039;&#039;&#039;start adminOnly&#039;&#039;&#039;) instead of the Jetty &#039;&#039;&#039;start.jar&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
If the migrate helper produces a &#039;&#039;&#039;.migration-report.txt&#039;&#039;&#039; file, review it before running the install — it will flag any pack renames that need attention.&lt;br /&gt;
&lt;br /&gt;
==== Installer breaking changes (Obsidian 6 → 7) ====&lt;br /&gt;
&lt;br /&gt;
* Headless automated install XML must use IzPack 5 panel class names and &#039;&#039;id&#039;&#039; attributes — migrate saved Obsidian 6 files with the tooling above.&lt;br /&gt;
* GUI installer — same configuration panels and outcomes; underlying engine is IzPack 5.&lt;br /&gt;
* Release zip — adds migrate JAR/scripts.&lt;br /&gt;
* Groovy and Flexmark libraries are now modular — see [[Advanced_Configuration#Dependent_Libraries]].&lt;br /&gt;
&lt;br /&gt;
== Automated Installer File ==&lt;br /&gt;
This section applies if you have saved an automated installer XML file from a previous version of Obsidian.&lt;br /&gt;
&lt;br /&gt;
If the release notes do not document any installer incompatibility between source and target releases, this means there are no new configuration options available and you can use your automated installer file without modification.  &lt;br /&gt;
&lt;br /&gt;
You can see [[Installation_Guide#Completing_the_Installation|installation configuration]] for more information, but essentially all you need to do is run &amp;lt;code&amp;gt;java -jar Obsidian-Install-n-n-n.jar my-obsidian-install-config.xml&amp;lt;/code&amp;gt;. You may wish to change the target installation path before proceeding.&lt;br /&gt;
&lt;br /&gt;
If the release notes do document installer incompatibility between releases, follow the relevant instructions to update your installer configuration file and then follow the same procedure.&lt;br /&gt;
&lt;br /&gt;
== Existing Configuration ==&lt;br /&gt;
&lt;br /&gt;
You have a choice when it comes to upgrading an Obsidian environment that is already configured.&lt;br /&gt;
&lt;br /&gt;
# You can rerun the installer UI to get the configured artifacts.&lt;br /&gt;
# Use the [[Installation_Guide#Running_the_Obsidian_Installer|quickstart]] installation mode to get the updated artifacts with the quickstart configuration.&lt;br /&gt;
&lt;br /&gt;
==== Existing Configuration with QuickStart ====&lt;br /&gt;
If you are using [[Advanced_Configuration#Properties.2FYaml_File|overrides]] support to specify &#039;&#039;&#039;ALL&#039;&#039;&#039; your configuration items, you likely are ready to go as the default configuration items are being overridden.&lt;br /&gt;
&lt;br /&gt;
Otherwise, you are relying at least partially on embedded configuration items. You will need to replace the quickstart configuration values with your existing configuration values. The Obsidian WAR files have the &amp;lt;code&amp;gt;com.carfey.(properties/yaml)&amp;lt;/code&amp;gt; file inside at &amp;lt;code&amp;gt;WEB-INF/classes/com.carfey.(properties/yaml)&amp;lt;/code&amp;gt; and the standalone installation has it at the root of &#039;&#039;obsidian-properties-configuration.jar&#039;&#039; or &#039;&#039;obsidian-yaml-configuration.jar&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Performing the Upgrade ==&lt;br /&gt;
We highly recommend performing a database backup and an installation backup (filesystem backup) prior to performing the upgrade with rollback strategies in place to restore the previous installation with its data.&lt;br /&gt;
&lt;br /&gt;
Obsidian automatically applies any database modifications during the first deployment of the new version.&lt;br /&gt;
&lt;br /&gt;
The simplest mechanism is to bring down all your Obsidian Scheduler nodes during a quiet scheduling period. Deploy the new artifacts and start the each node individually verifying its startup before proceeding to the next node.&lt;br /&gt;
&lt;br /&gt;
== Database Upgrade Scripts ==&lt;br /&gt;
&#039;&#039;Available as of version 3.0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When you start Obsidian, it will automatically upgrade the schema in your target database. However, if you wish to run Obsidian with a database user without create and drop privileges, or simply wish to prepare your database structure ahead of time, you can use the database upgrade scripts provided with your download zip file under the &amp;quot;db_scripts&amp;quot; directory.&lt;br /&gt;
&lt;br /&gt;
First locate all files named &amp;quot;*upgrade.sql&amp;quot; under the directory for the database you are using under the &amp;quot;db_scripts&amp;quot; directory. Statements within these files contain the token &amp;quot;$px$&amp;quot; to enable table prefixes. Before you run the SQL files, replace all instances of the token &amp;quot;$px$&amp;quot; (without quotes) with a table prefix 6 characters or shorter (letters and underscores supported), or with blank.&lt;br /&gt;
&lt;br /&gt;
Then, in your SQL client of choice, execute the scripts in order of their version numbers. This will upgrade your schema to your target version.&lt;br /&gt;
&lt;br /&gt;
You&#039;ll need to allow the data portion of the migrations to execute while preventing the DDL scripts to run. To do this, you need to [[Getting_Started#Disabling_DDL_Updates|disable DDL Updates]].&lt;br /&gt;
&lt;br /&gt;
== Performing an Always On Cluster Upgrade ==&lt;br /&gt;
&lt;br /&gt;
If you absolutely must maintain at least one node running, Obsidian should be able to continue scheduling and executing on a single node while the other(s) is/are upgraded although we make no assurances and recommend that you &#039;&#039;&#039;test out your specific upgrade scenario&#039;&#039;&#039; first. Depending on the content between source and target releases, we also recommend that you don&#039;t attempt to perform other changes such as job configuration changes, failure resubmissions, etc. during this time. Feel free to [[Contact_the_Obsidian_Scheduler_Team|contact us]] with questions about your specific upgrade scenario.&lt;br /&gt;
&lt;br /&gt;
===== Always On Cluster Upgrade Steps =====&lt;br /&gt;
# Bring down all but one Obsidian Scheduler node. &lt;br /&gt;
# Target a downed node for upgrade.&lt;br /&gt;
# Deploy the upgraded artifacts to the targeted downed node.&lt;br /&gt;
# Startup the upgraded node.&lt;br /&gt;
# Verify successful startup.&lt;br /&gt;
# Bring down the still-running older Obsidian Scheduler node.&lt;br /&gt;
# Repeat steps 3-5 for each remaining downed node in the cluster.&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Upgrading_Obsidian&amp;diff=4095</id>
		<title>Upgrading Obsidian</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Upgrading_Obsidian&amp;diff=4095"/>
		<updated>2026-07-09T20:53:11Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are a number of options available to you. Select the one that best suits your situation.&lt;br /&gt;
&lt;br /&gt;
Note that you don&#039;t necessarily need to go through the installer UI again, although you&#039;re free to do so. Since the primary purpose of the installer is to provide fully configured Obsidian artifacts and your environment would already be configured, you really just need the updated artifacts (libraries and WAR files). Even if you want to take advantage of new configuration options, you could use the [[Advanced_Configuration|Configuration Reference]] to make the necessary changes.&lt;br /&gt;
&lt;br /&gt;
=== Upgrading to 7.0.0 ===&lt;br /&gt;
&lt;br /&gt;
==== Remember Me removal ====&lt;br /&gt;
&lt;br /&gt;
The Remember Me feature has been removed. No operator action is required. On first startup after the upgrade, &#039;&#039;Release7Dot0Dot0Upgrader&#039;&#039; runs automatically and drops the &#039;&#039;USER_COOKIE&#039;&#039; table (if it exists) and removes the &#039;&#039;allowRememberMe&#039;&#039; system parameter. Users who had active Remember Me sessions will be prompted to log in on their next visit.&lt;br /&gt;
&lt;br /&gt;
==== OAuth / OIDC authentication (optional) ====&lt;br /&gt;
&lt;br /&gt;
Obsidian 7.0.0 adds an optional OAuth / OIDC authenticator. Existing installations continue to use their current authenticator (DB or LDAP) with no changes required. To switch to OAuth / OIDC: configure &#039;&#039;OAuthAuthenticator&#039;&#039; properties in the Obsidian configuration file (&#039;&#039;com.carfey.properties&#039;&#039; or YAML equivalent) — see [[Authenticator#OAuthAuthenticator_(OIDC_SSO)]] and [[Advanced_Configuration#OAuth_/_OIDC_Authentication_Properties]] — then restart Obsidian.&lt;br /&gt;
&lt;br /&gt;
==== Migrating saved automated install XML (Obsidian 6 → 7) ====&lt;br /&gt;
&lt;br /&gt;
If you use headless / automated install with an XML file saved from Obsidian 6 (IzPack 4.3.5), you must migrate that file before installing with Obsidian 7. Unzip the Obsidian 7.0.0 download and run the migrate helper (Windows: &#039;&#039;&#039;migrate-headless.bat --in my-old-config.xml --out my-config-izpack5.xml&#039;&#039;&#039;, Unix: &#039;&#039;&#039;migrate-headless.sh&#039;&#039;&#039; with the same arguments, or &#039;&#039;&#039;java -jar Obsidian-Install-Migrate.jar --in my-old-config.xml --out my-config-izpack5.xml&#039;&#039;&#039;). Review &#039;&#039;&#039;my-config-izpack5.xml.migration-report.txt&#039;&#039;&#039; only if the tool creates one — if it lists unknown panels or keys, contact [[Support|Carfey support]]. Then install with the migrated file: &#039;&#039;&#039;java -jar Obsidian-Install-7.0.0.jar my-config-izpack5.xml&#039;&#039;&#039;. The migrate helper covers Obsidian&#039;s standard installer panels only and does not modify product installer descriptors or custom installers.&lt;br /&gt;
&lt;br /&gt;
==== Upgrading evaluation installs (Jetty quick start → embedded Tomcat) ====&lt;br /&gt;
&lt;br /&gt;
Obsidian 7.0.0 removes the Jetty quick-start pack and &#039;&#039;&#039;jetty-home&#039;&#039;&#039; distribution. If you previously installed with a Jetty-based quick start or embedded Jetty pack:&lt;br /&gt;
&lt;br /&gt;
# Re-run the installer or edit your automated install XML to select &#039;&#039;&#039;Obsidian Embedded Tomcat JAR&#039;&#039;&#039; (scheduler) or &#039;&#039;&#039;Obsidian Standalone Admin Embedded Tomcat JAR&#039;&#039;&#039; (admin), &#039;&#039;&#039;and&#039;&#039;&#039; the matching WAR pack.&lt;br /&gt;
# Remove references to legacy Jetty pack names in any saved automated install XML. If the file is still IzPack 4 format, run the migrate helper first (see [[Upgrading_Obsidian#Migrating_saved_automated_install_XML_.28Obsidian_6_.E2.86.92_7.29|Migrating saved automated install XML]]).&lt;br /&gt;
# After install, use &#039;&#039;&#039;webObsidian start scheduler&#039;&#039;&#039; (or &#039;&#039;&#039;start adminOnly&#039;&#039;&#039;) instead of the Jetty &#039;&#039;&#039;start.jar&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
If the migrate helper produces a &#039;&#039;&#039;.migration-report.txt&#039;&#039;&#039; file, review it before running the install — it will flag any pack renames that need attention.&lt;br /&gt;
&lt;br /&gt;
==== Installer breaking changes (Obsidian 6 → 7) ====&lt;br /&gt;
&lt;br /&gt;
* Headless automated install XML must use IzPack 5 panel class names and &#039;&#039;id&#039;&#039; attributes — migrate saved Obsidian 6 files with the tooling above.&lt;br /&gt;
* GUI installer — same configuration panels and outcomes; underlying engine is IzPack 5.&lt;br /&gt;
* Release zip — adds migrate JAR/scripts.&lt;br /&gt;
* Groovy and Flexmark libraries are now modular — see [[Advanced_Configuration#Dependent_Libraries]].&lt;br /&gt;
&lt;br /&gt;
== Automated Installer File ==&lt;br /&gt;
This section applies if you have saved an automated installer XML file from a previous version of Obsidian.&lt;br /&gt;
&lt;br /&gt;
If the release notes do not document any installer incompatibility between source and target releases, this means there are no new configuration options available and you can use your automated installer file without modification.  &lt;br /&gt;
&lt;br /&gt;
You can see [[Installation_Guide#Completing_the_Installation|installation configuration]] for more information, but essentially all you need to do is run &amp;lt;code&amp;gt;java -jar Obsidian-Install-n-n-n.jar my-obsidian-install-config.xml&amp;lt;/code&amp;gt;. You may wish to change the target installation path before proceeding.&lt;br /&gt;
&lt;br /&gt;
If the release notes do document installer incompatibility between releases, follow the relevant instructions to update your installer configuration file and then follow the same procedure.&lt;br /&gt;
&lt;br /&gt;
== Existing Configuration ==&lt;br /&gt;
&lt;br /&gt;
You have a choice when it comes to upgrading an Obsidian environment that is already configured.&lt;br /&gt;
&lt;br /&gt;
# You can rerun the installer UI to get the configured artifacts.&lt;br /&gt;
# Use the [[Installation_Guide#Running_the_Obsidian_Installer|quickstart]] installation mode to get the updated artifacts with the quickstart configuration.&lt;br /&gt;
&lt;br /&gt;
==== Existing Configuration with QuickStart ====&lt;br /&gt;
If you are using [[Advanced_Configuration#Properties.2FYaml_File|overrides]] support to specify &#039;&#039;&#039;ALL&#039;&#039;&#039; your configuration items, you likely are ready to go as the default configuration items are being overridden.&lt;br /&gt;
&lt;br /&gt;
Otherwise, you are relying at least partially on embedded configuration items. You will need to replace the quickstart configuration values with your existing configuration values. The Obsidian WAR files have the &amp;lt;code&amp;gt;com.carfey.(properties/yaml)&amp;lt;/code&amp;gt; file inside at &amp;lt;code&amp;gt;WEB-INF/classes/com.carfey.(properties/yaml)&amp;lt;/code&amp;gt; and the standalone installation has it at the root of &#039;&#039;obsidian-properties-configuration.jar&#039;&#039; or &#039;&#039;obsidian-yaml-configuration.jar&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Performing the Upgrade ==&lt;br /&gt;
We highly recommend performing a database backup and an installation backup (filesystem backup) prior to performing the upgrade with rollback strategies in place to restore the previous installation with its data.&lt;br /&gt;
&lt;br /&gt;
Obsidian automatically applies any database modifications during the first deployment of the new version.&lt;br /&gt;
&lt;br /&gt;
The simplest mechanism is to bring down all your Obsidian Scheduler nodes during a quiet scheduling period. Deploy the new artifacts and start the each node individually verifying its startup before proceeding to the next node.&lt;br /&gt;
&lt;br /&gt;
== Database Upgrade Scripts ==&lt;br /&gt;
&#039;&#039;Available as of version 3.0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When you start Obsidian, it will automatically upgrade the schema in your target database. However, if you wish to run Obsidian with a database user without create and drop privileges, or simply wish to prepare your database structure ahead of time, you can use the database upgrade scripts provided with your download zip file under the &amp;quot;db_scripts&amp;quot; directory.&lt;br /&gt;
&lt;br /&gt;
First locate all files named &amp;quot;*upgrade.sql&amp;quot; under the directory for the database you are using under the &amp;quot;db_scripts&amp;quot; directory. Statements within these files contain the token &amp;quot;$px$&amp;quot; to enable table prefixes. Before you run the SQL files, replace all instances of the token &amp;quot;$px$&amp;quot; (without quotes) with a table prefix 6 characters or shorter (letters and underscores supported), or with blank.&lt;br /&gt;
&lt;br /&gt;
Then, in your SQL client of choice, execute the scripts in order of their version numbers. This will upgrade your schema to your target version.&lt;br /&gt;
&lt;br /&gt;
You&#039;ll need to allow the data portion of the migrations to execute while preventing the DDL scripts to run. To do this, you need to [[Getting_Started#Disabling_DDL_Updates|disable DDL Updates]].&lt;br /&gt;
&lt;br /&gt;
== Performing an Always On Cluster Upgrade ==&lt;br /&gt;
&lt;br /&gt;
If you absolutely must maintain at least one node running, Obsidian should be able to continue scheduling and executing on a single node while the other(s) is/are upgraded although we make no assurances and recommend that you &#039;&#039;&#039;test out your specific upgrade scenario&#039;&#039;&#039; first. Depending on the content between source and target releases, we also recommend that you don&#039;t attempt to perform other changes such as job configuration changes, failure resubmissions, etc. during this time. Feel free to [[Contact_the_Obsidian_Scheduler_Team|contact us]] with questions about your specific upgrade scenario.&lt;br /&gt;
&lt;br /&gt;
===== Always On Cluster Upgrade Steps =====&lt;br /&gt;
# Bring down all but one Obsidian Scheduler node. &lt;br /&gt;
# Target a downed node for upgrade.&lt;br /&gt;
# Deploy the upgraded artifacts to the targeted downed node.&lt;br /&gt;
# Startup the upgraded node.&lt;br /&gt;
# Verify successful startup.&lt;br /&gt;
# Bring down the still-running older Obsidian Scheduler node.&lt;br /&gt;
# Repeat steps 3-5 for each remaining downed node in the cluster.&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Release_Notes&amp;diff=4094</id>
		<title>Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Release_Notes&amp;diff=4094"/>
		<updated>2026-07-09T20:52:24Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Please review our [[Upgrading_Obsidian|Upgrade Instructions]].&lt;br /&gt;
&lt;br /&gt;
Read about our [[Planned_Releases|Planned Releases]].&lt;br /&gt;
&lt;br /&gt;
Looking for old release notes? See [[Release_Notes_-_Older_Releases|Release Notes - Older Releases]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toclimit-2&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obsidian 7.0.0 ==&lt;br /&gt;
&lt;br /&gt;
To Be Released July 2026&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;OAuth 2.0 / OIDC Single Sign-On&#039;&#039;&#039; — Obsidian now supports OAuth 2.0 / OIDC SSO authentication via [[Authenticator#OAuthAuthenticator_(OIDC_SSO)|OAuthAuthenticator]]. Configure any OIDC-compliant identity provider (Keycloak, Microsoft Entra ID, Okta, Auth0, or Generic OIDC) as the login provider. See [[Advanced_Configuration#OAuth_/_OIDC_Authentication_Properties|OAuth/OIDC Authentication Properties]] for full configuration details.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Bearer JWT authentication for the REST API&#039;&#039;&#039; — REST clients can now authenticate using a signed JWT access token in the &#039;&#039;Authorization: Bearer&#039;&#039; header. See [[Advanced_Configuration#OAuth_/_OIDC_Authentication_Properties|OAuth/OIDC Authentication Properties]] for configuration.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Installer upgrade (IzPack 5)&#039;&#039;&#039; — Obsidian 7.0.0 ships an IzPack 5-based installer. GUI and headless installs behave as in Obsidian 6 for standard flows. Customers with saved Obsidian 6 automated install XML must run the migrate helper included in the download before headless install. See [[Upgrading_Obsidian#Migrating_saved_automated_install_XML_.28Obsidian_6_.E2.86.92_7.29|Upgrading Obsidian]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Embedded Tomcat quick start&#039;&#039;&#039; — Jetty quick-start pack removed; evaluation and local runs now use Apache Tomcat 10.1.x embedded runtime (Jakarta Servlet 5). The release zip includes &#039;&#039;&#039;h2-tomcat-quick-start.xml&#039;&#039;&#039; as a ready-to-use sample. Four installer deployment profiles are available: Obsidian WAR, Obsidian Embedded Tomcat JAR, Obsidian Standalone Admin WAR, and Obsidian Standalone Admin Embedded Tomcat JAR. See [[Installation_Guide#Deployment_options|Deployment options]] and [[Getting_Started#Starting_Obsidian_with_embedded_Tomcat|Starting embedded Tomcat]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Global parameter autocomplete and tooltips&#039;&#039;&#039; — While editing a job, typing &#039;&#039;{{&#039;&#039; in a parameter value opens suggestions for global parameter names (subject to visibility settings). On job view, hover over values containing &#039;&#039;Name&#039;&#039; to see resolved global values when your user&#039;s permissions allow. Administration screens for defining global parameters are unchanged. See [[Advanced_Configuration|Advanced Configuration]] for visibility settings.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Install-time dependency resolution&#039;&#039;&#039; — The published installer download does not embed public open-source JARs. Libraries are fetched (or read from a pre-staged cache) when you run the installer. See [[Installation_Guide#Offline_or_restricted-network_install|Offline install]] for air-gapped preparation steps.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Modular Groovy and Flexmark libraries&#039;&#039;&#039; — Obsidian no longer ships &#039;&#039;&#039;apache-groovy-all-4.0.24.jar&#039;&#039;&#039; or &#039;&#039;&#039;flexmark-util-0.62.2.jar&#039;&#039;&#039; uber archives. Scripting and UI documentation rendering use the modular JAR sets documented in [[Advanced_Configuration#Dependent_Libraries|Dependent Libraries]].&lt;br /&gt;
&lt;br /&gt;
=== Removals ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Remember Me login option removed&#039;&#039;&#039; — The Remember Me checkbox and associated session-cookie mechanism have been removed. The &#039;&#039;USER_COOKIE&#039;&#039; table and &#039;&#039;allowRememberMe&#039;&#039; system parameter are removed automatically during the upgrade to 7.0.0; no operator action is required.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;User logout&#039;&#039;&#039; - Fixed an issue where users were not fully logged out in certain session states.&lt;br /&gt;
* &#039;&#039;&#039;Job edit screen accessible to users with no roles&#039;&#039;&#039; — Users with no assigned roles could previously access the job edit screen but not make changes; this has been corrected.&lt;br /&gt;
* &#039;&#039;&#039;Firefox UI icons&#039;&#039;&#039; — Fixed icons not rendering correctly in Firefox.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.4.0 ==&lt;br /&gt;
Released December 2025&lt;br /&gt;
&lt;br /&gt;
=== Enhancements === &lt;br /&gt;
* New [[Built-in_Jobs#Obsidian_Execution_Statistics_Job|Execution Statistics Job]] and built in [[Admin_Job_Stats|UI]] and [[Embedded_API#List_Stats|Embedded API]] and [[REST_Endpoints#GET_a_list_of_job_execution_statistics|REST API]]&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Fixed issue preventing [[Admin_Jobs#Deleting|job deletion]] when resubmissions of failed executions existed. Bug existed in UI and APIs.&lt;br /&gt;
* Fixed UI styling issue for [[Admin_Jobs#Deleting|job deletion]] where checkbox label did not appear.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.3 ==&lt;br /&gt;
Released November 2025&lt;br /&gt;
&lt;br /&gt;
=== Enhancements === &lt;br /&gt;
* [https://web.obsidianscheduler.com/obsidianapi/com/carfey/suite/security/LdapAuthenticator.html LDAPAuthenticator] supports configurable check user active override - com.carfey.suite.security.LdapAuthenticator.checkActiveAttribute&lt;br /&gt;
* [https://web.obsidianscheduler.com/obsidianapi/com/carfey/suite/security/LdapAuthenticator.html#isUserActive(javax.naming.directory.DirContext,java.lang.String) LDAPAuthenticator.isUserActive(DirContext,String)] visibility increased to protected to allow for functionality override in subclasses.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Correct LdapAuthenticator case with delimited configuration where active check wasn&#039;t applied.&lt;br /&gt;
* [https://web.obsidianscheduler.com/obsidianapi/com/carfey/suite/security/LdapAuthenticator.html#isUserActive(javax.naming.directory.DirContext,java.lang.String) LDAPAuthenticator.isUserActive(DirContext,String)] javadoc added for isUserActive fully detailing the implementation.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.2 ==&lt;br /&gt;
Released October 2025&lt;br /&gt;
&lt;br /&gt;
=== Enhancements === &lt;br /&gt;
* Notification failures now trigger Dispatch category Error level event on first failure. For use in log alerts and Event Hooks.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Notification failures no longer log on every failure reducing chatty failure logs.&lt;br /&gt;
* No-arg constructors added to multiple JSON serializable candidate POJOs missing them. Addresses GSON&#039;s workaround use of sun.misc.Unsafe.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.1 ==&lt;br /&gt;
Released August 2025&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Fix failure response codes on [[REST_Endpoints#GET_health_details_on_an_existing_scheduling_host|REST health endpoint]]&lt;br /&gt;
* Fix automatic upgrade issue from 6.1.0 to any of 6.2.0, 6.2.1, 6.3.0&lt;br /&gt;
* Fix auth issue when [[Admin_User_Management#Multi-Factor_Authentication_.28MFA.29|MFA]] is enabled that allows REST access when account has been locked out due to MFA not being setup.  [[Contact_the_Obsidian_Scheduler_Team|Contact us]] if you need workaround details for earlier versions.&lt;br /&gt;
* Fix native auth issue that allows REST access when account has been flagged as inactive.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.0 ==&lt;br /&gt;
Released July 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Cron day of month expansion for [[Cron#Special_Character_Usage|day of week proximity]] using [[Cron#Examples|~]]&lt;br /&gt;
* Annotation based job and chain configuration [[Initializing_and_Restoring#Annotation_Initialization|initialization]]&lt;br /&gt;
* Health endpoint with details for Job Queuer and Job Spawner - [[REST_Endpoints#GET_health_details_on_an_existing_scheduling_host|REST API]] or Embedded API [https://web.obsidianscheduler.com/obsidianapi/com/carfey/ops/api/embedded/HostManager.html#getHealth(java.lang.String) by hostname] or [https://web.obsidianscheduler.com/obsidianapi/com/carfey/ops/api/embedded/HostManager.html#getHealth(long) by host id]&lt;br /&gt;
* JDBC URL construction from parts [[Advanced_Configuration#Database_Properties|host/port/databaseName/dbType/oracleSid]]&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.2.1 ==&lt;br /&gt;
Released June 2025&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Certain recoveries greater than 24 hours using new day of month proximity patterns introduced in 6.2.0 would result in no jobs spawning.&lt;br /&gt;
* Migrations targeting 6.0.0 and greater that start earlier than 5.0.0 skip the 5.0.0 migration. Migrating to any 5.x version first and then to 6.0.0 or later works around this issue.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.2.0 ==&lt;br /&gt;
Released May 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Cron day of month expansion for [[Cron#Special_Character_Usage|day of week proximity]] using [[Cron#Examples|&amp;lt; &amp;gt; ≥ ≤]]&lt;br /&gt;
* Cron day of month expansion for [[Cron#Special_Character_Usage|weekday proximity]] using [[Cron#Examples|&amp;lt; &amp;gt; ≥ ≤]]&lt;br /&gt;
* [[Admin_Global_Parameters#Using_Global_Parameters_in_Jobs|Global Parameters]] reference in job edit page support mouseover/title display of actual value when permissions allow&lt;br /&gt;
* Host time displayed in [[Admin_Host_Status|hosts status]] in UI&lt;br /&gt;
* [[Admin_Job_Runtime_Preview|Runtime Preview]] optimizations for large date ranges in both UI and APIs.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Combination of table prefix, sorting by clob column and Oracle metadata load failure no longer results in sql error. This occurred in the UI when viewing raw job history results and in API calls for job runtime results.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.1.1 ==&lt;br /&gt;
Released March 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Authenticator#Implementation_of_a_Custom_Authenticator|Authenticator]] supports optional &amp;lt;code&amp;gt;authenticateREST()&amp;lt;/code&amp;gt; method.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication REST logins do not apply &#039;last login&#039; timestamps. Avoids noisy error that was appearing in logs.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.1.0 ==&lt;br /&gt;
Released March 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication now disables users after 4 invalid login attempts, either password or MFA code if applicable. Invalid attempts threshold is configurable.&lt;br /&gt;
* Native authentication last login datetime displayed on list user screen.&lt;br /&gt;
* Stronger licensing controls. Site and hardware licenses as of this version must be regenerated by Carfey Software and every 2 years. Contact us at licensing [[Image:atSymbol.png]] obsidianscheduler.com.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication password complexity pattern properly created and no longer overwritten on restart.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.0.1 ==&lt;br /&gt;
Released February 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Built-in_Jobs#File_Archive_Job|File Archive Job]] and [[Built-in_Jobs#File_Scanner_Job|File Scanner Job]] both now support min/max file sizes and minimum age.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication user updates now support long passwords.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.0.0 ==&lt;br /&gt;
Released December 27, 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Jakarta Servlet 5.0&lt;br /&gt;
** Servlet container for Web Admin must support Jakarta Servlet 5.0 (e.g. Tomcat 10, Jetty 11)&lt;br /&gt;
* [[Micronaut_Integration|Micronaut]] integration support&lt;br /&gt;
* [[Advanced_Configuration#Dependent_Libraries|Groovy 4]] support&lt;br /&gt;
* [[Advanced_Configuration#Properties.2FYaml_File|Yaml]] configuration support&amp;lt;ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are using automated installer files from previous releases, you will need to add an additional configuration item to choose between yaml and properties formats in UserInputPanel.0.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;com.izforge.izpack.panels.UserInputPanel id=&amp;quot;UserInputPanel.0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;userInput&amp;gt;&lt;br /&gt;
......snip......&lt;br /&gt;
            &amp;lt;entry key=&amp;quot;config.format&amp;quot; value=&amp;quot;yaml&amp;quot; /&amp;gt;&lt;br /&gt;
OR&lt;br /&gt;
            &amp;lt;entry key=&amp;quot;config.format&amp;quot; value=&amp;quot;properties&amp;quot; /&amp;gt;&lt;br /&gt;
......snip......&lt;br /&gt;
        &amp;lt;/userInput&amp;gt;&lt;br /&gt;
    &amp;lt;/com.izforge.izpack.panels.UserInputPanel&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Native authentication supports customizable [[Admin_Login#Password_Complexity|password complexity]] requirements&lt;br /&gt;
* XML support deprecated across the product including XML UI downloads, XML runner configurations and XML license leases.&lt;br /&gt;
** &#039;&#039;&#039;Starting January 1st 2027, XML license lease requests will stop being processed. All Obsidian instances running using internet-verified licenses (including licence key proxies) will be required to use release 6.0.0 or later as of January 1st 2027.&#039;&#039;&#039;&lt;br /&gt;
** Above noted XML support will be removed in the first Obsidian version released in 2027.&lt;br /&gt;
* License leases use JSON payloads.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.5.1 ==&lt;br /&gt;
Released December 16, 2024&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Admin only (no scheduler) UI no longer generates event hook errors while running nor during shutdown&lt;br /&gt;
* Quick start installer file no longer generates errors during installation&lt;br /&gt;
* A few small web UI enhancements&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.5.0 ==&lt;br /&gt;
Released October 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Event Hooks management available in [[Admin_Host_Status#Event_Hook_Status|UI]], [[Embedded_API#Event_Hook_Resume_or_Pause|Embedded API]] and [[REST_Endpoints#POST_event_hook_pause_or_resume|REST API]].&lt;br /&gt;
* [[Installation_Guide#Additional_configuration_items|Installer]] supports custom add on configurations    &#039;&#039;&#039;Potential breaking change to automated installer files.&#039;&#039;&#039; &amp;lt;ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are using automated installer files from previous releases, you will need to add a new section of xml as of Obsidian 5.5.0 to handle a new UserInputPanel. Immediately after the UserInputPanel.17 closing brace, add the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;com.izforge.izpack.panels.UserInputPanel id=&amp;quot;UserInputPanel.18&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;userInput&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.1&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.2&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.3&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.4&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.5&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.6&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.7&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.8&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.9&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.10&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.11&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.12&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.13&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.14&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.15&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.16&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.17&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.18&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.19&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.20&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.1&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.2&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.3&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.4&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.5&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.6&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.7&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.8&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.9&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.11&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.10&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.12&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.13&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.14&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.15&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.16&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.17&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.18&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.19&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.20&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/userInput&amp;gt;&lt;br /&gt;
&amp;lt;/com.izforge.izpack.panels.UserInputPanel&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Certain Cron expressions that fail to generate text descriptions no longer impact scheduling.&lt;br /&gt;
* Text database columns were previously restricted to maximum length of MySQL implementation. Corrected to validate length via DB implementation.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.4.0 ==&lt;br /&gt;
Released June 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Event Hooks available in [[Embedded_API#List_Event_Hooks|Embedded API]] and [[REST_Endpoints#GET_event_hooks|REST API]].&lt;br /&gt;
* [[Advanced_Configuration#Dependent_Libraries|GSON library]] upgrade to support Java 21&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Oracle identifier no longer too long when using prefixes.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.3.0 ==&lt;br /&gt;
Released March 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* New [[Admin_Host_Status#Event_Hook_Status| Event Hooks Status]] available in the UI.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Some improvements throughout the [[Admin_Web_Application_Guide|Admin Web Application]] for autofocus of fields.&lt;br /&gt;
* Additional classes and interfaces added to [https://web.obsidianscheduler.com/obsidianapi/ javadoc].&lt;br /&gt;
* Some cleanup in [https://web.obsidianscheduler.com/obsidianapi/ javadoc] documenation.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.2.1 == &lt;br /&gt;
Released January 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Built-in_Jobs#Maintenance_Jobs|Maintenance Jobs]] are now scheduled by default in new installations. Can be disabled via [[Advanced_Configuration#Miscellaneous_Properties|Configuration]] property.&lt;br /&gt;
* New [[Event_Hooks#Standard_Output.2FError_Streams_Event_Hook | Standard Output/Error Streams Event Hook]].&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Schedule descriptions are now updated after edits are applied in all UI screens and APIs.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.2.0 ==&lt;br /&gt;
Released December 2023&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Cron]] &amp;amp; [[Cron#Recurrence|Recur]] patterns along with any use of [[Admin_Schedule_Aliases|Schedule Aliases]] now support plain language description of the patterns throughout the [[Admin_Web_Application_Guide|UI]], visible while hovering patterns, and in [[REST_Endpoints|REST]] and [[Embedded_API|Embedded]] API responses.&lt;br /&gt;
* All screens supporting UI exports now support JSON ([[Admin_Job_Activity#Exporting_Results|Job Activity]], [[Admin_Jobs#Exporting_Results|Jobs]], [[Admin_Job_Runtime_Preview#Exporting_Results|Runtime Previews]], [[Admin_Job_Chains#Job_Chain_Listing|Job Chains]], [[Admin_Logs#Exporting_Results|Logs]], [[Admin_Notifications#Exporting_Results|Sent Notifications]], [[Admin_User_Management#Exporting_Results|Users]], [[Admin_Custom_Calendars#Calendar_Listing|Calendars]])&lt;br /&gt;
* All screens supporting UI exports and search criteria and/or inline filters now include any specified search criteria and filter text in Excel, XML and JSON downloads ([[Admin_Job_Activity#Exporting_Results|Job Activity]], [[Admin_Jobs#Exporting_Results|Jobs]], [[Admin_Job_Runtime_Preview#Exporting_Results|Runtime Previews]], [[Admin_Job_Chains#Job_Chain_Listing|Job Chains]], [[Admin_Logs#Exporting_Results|Logs]], [[Admin_Notifications#Exporting_Results|Sent Notifications]], [[Admin_User_Management#Exporting_Results|Users]])&lt;br /&gt;
* Support for [[Installation_Guide#Choosing_Email_Support|Jakarta EE mail]] &#039;&#039;&#039;Potential breaking change to automated installer files.&#039;&#039;&#039; &amp;lt;ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are using automated installer files from previous releases and had email configured, you will need to add a new section of xml as of Obsidian 5.2.0 to handle a new UserInputPanel. Immediately after the UserInputPanel.16 closing brace, add the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;com.izforge.izpack.panels.UserInputPanel id=&amp;quot;UserInputPanel.17&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;userInput&amp;gt;&lt;br /&gt;
        &amp;lt;entry key=&amp;quot;mail.type.selection&amp;quot; value=&amp;quot;javax&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/userInput&amp;gt;&lt;br /&gt;
&amp;lt;/com.izforge.izpack.panels.UserInputPanel&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
* New [[Event_Hooks#REST_Endpoint_Event_Hook|REST Endpoint Event Hook]]&lt;br /&gt;
* [[Key_Server_Proxy|Key Server proxy]] artifact obtained via web download during installation&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Time picker buttons (hour, minute, AM/PM) in [[Admin_Job_Activity#Filtering|Job Activity filtering]] no longer change other elements of the selected time.&lt;br /&gt;
* Cron pattern with [[Cron#Special_Character_Usage|LW]] and any other non-L value in day position no longer also incorrectly evaluates to last day.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.1.1 ==&lt;br /&gt;
Released June 2023&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* [[Authenticator|Native authentication]] no longer fails when user deletes are attempted from the UI.&lt;br /&gt;
* Built in maintenance job [[Built-in_Jobs#Job_History_Cleanup_Job|Job History Cleanup]] no longer leaves deletion candidate CHAIN SKIPPED records in the JOB_HISTORY table in rare circumstances.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.1.0 ==&lt;br /&gt;
Released April 2023&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Admin_Schedule_Aliases#Schedule_Alias_Fragments|Schedule Aliases]] now support fragments for configuration-time substitutions.&lt;br /&gt;
* New convenience job [[Built-in_Jobs#Database_File_Export_Job|Database File Export Job]] for generating basic file extracts from database queries.&lt;br /&gt;
* New convenience job [[Built-in_Jobs#REST_Invocation_Job|REST Invocation Job]] for making simple REST calls and storing results.&lt;br /&gt;
* Performance improvements in job failure handling.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.4 == &lt;br /&gt;
Released February 2022&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.17.1 as fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.17.1 RCE vulnerability] where attackers can modify log4j configuration.&lt;br /&gt;
* Restore missing default log4j2 configuration in installation artifacts.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.3 == &lt;br /&gt;
Released December 2021&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.17.0 as fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.17.0 DOS vulnerability]&lt;br /&gt;
* Fix native login issue showing as inactive on some databases.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.2 == &lt;br /&gt;
Released December 2021&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.16.0 as permanent fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.16.0 RCE vulnerability]&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.1 == &lt;br /&gt;
Released December 2021&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.15.0 as fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.15.0 RCE vulnerability]&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
* Fix sporadic native login issue on some databases.&lt;br /&gt;
* Formatting fix in quick installer file&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.0 == &lt;br /&gt;
Released August 2021.&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Java 11 (minimum Java version)&lt;br /&gt;
* [[Admin_Schedule_Aliases|Schedule Aliases]] including support in [[REST_Endpoints#Schedule_Alias_Endpoints|REST API]] and [[Embedded_API#ScheduleAliasManager_API|Embedded API]]&lt;br /&gt;
* [[Admin_User_Management#Multi-Factor_Authentication_.28MFA.29|MFA Support]] for UI logins&lt;br /&gt;
* New [[Admin_User_Management#User_Rights|Author and Operator]] roles&lt;br /&gt;
* Convention-based role permissions by [[Admin_User_Management#Job_Folder_Rights|root job folder]] for Write, Author and Operator.&amp;lt;ref&amp;gt;&lt;br /&gt;
There is a possibility of a breaking change to Embedded or REST API use due to the need to change the [[Embedded_API#Enumerations|User Role enumeration]] from a Java enum to an enum-style class to support this feature. Bringing in the upgraded Obsidian library and compiling should reveal any such broken use of these enumerations. Needed changes should be minor and self-explanatory.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Bundled Jetty 10.0.2&lt;br /&gt;
* Legacy Embedded API (from Obsidian 1.5) dropped&lt;br /&gt;
* Signal handler disabled by default. Enabled only via [[Advanced_Configuration#Miscellaneous_Properties|configuration]].&lt;br /&gt;
* Many [[Advanced_Configuration#Dependent_Libraries|library upgrades]].&lt;br /&gt;
* UI javascript library updates.&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=File:Obsidian-7.0.0-Installation-Packages.png&amp;diff=4093</id>
		<title>File:Obsidian-7.0.0-Installation-Packages.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=File:Obsidian-7.0.0-Installation-Packages.png&amp;diff=4093"/>
		<updated>2026-07-09T20:48:22Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Installation_Guide&amp;diff=4092</id>
		<title>Installation Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Installation_Guide&amp;diff=4092"/>
		<updated>2026-07-09T20:47:10Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;This installation guide generally applies to Obsidian versions 4.0 and newer but is specific to 6.0. You may see a few minor differences in 4.x and 5.x releases. See the [[Installation_Guide_(3.x.x_and_earlier)|Installation Guide]] for all prior versions.&lt;br /&gt;
&lt;br /&gt;
This installation guide is a companion to the Obsidian Installer UI. Its purpose is to provide additional detail as to the meaning of various inputs and to provide guidance on advanced usage of the installer.&lt;br /&gt;
&lt;br /&gt;
The installer itself installs and configures the artifacts. The configured artifacts will have their [[Advanced_Configuration#Properties_File|Properties]] file configured according to the choices made during the installation process. You may always change these later or use one of the [[Advanced_Configuration#Properties_File|override]] mechanisms.&lt;br /&gt;
== Running the Obsidian Installer ==&lt;br /&gt;
The installer is an executable JAR file in the Obsidian download zip package available on our [https://web.obsidianscheduler.com/download/ download page].&lt;br /&gt;
&lt;br /&gt;
The installer can be run from the command line as a graphical user interface using &amp;lt;code&amp;gt;java -jar Obsidian-Install-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;.jar&amp;lt;/code&amp;gt; or in interactive console mode using &amp;lt;code&amp;gt;java -jar Obsidian-Install-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;.jar -console&amp;lt;/code&amp;gt;. Note that you will have to replace the JAR file name with the actual versioned name in your installation.&lt;br /&gt;
&lt;br /&gt;
On some platforms, simple double-clicking the JAR file will start it in graphical interface mode.&lt;br /&gt;
&lt;br /&gt;
If you are doing a version upgrade of Obsidian or are otherwise uninterested in actually configuring the artifacts, you can run the quick start mode to get the default configured artifacts using &amp;lt;code&amp;gt;java -jar Obsidian-Install-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;.jar h2-winstone-quick-start.xml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Obsidian Installer Artifacts ==&lt;br /&gt;
&lt;br /&gt;
The Obsidian Installer installs and configures a number of artifacts. You can choose which artifacts to create, but most users can leave the default options selected.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Artifacts.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Obsidian WAR&#039;&#039;&#039; - This is the Obsidian Web Admin UI with scheduler component enabled. Configuration will be found at &#039;&#039;INSTALL_PATH&#039;&#039;/obsidian.war!/WEB-INF/classes/com.carfey.properties.&lt;br /&gt;
# &#039;&#039;&#039;Obsidian Standalone Admin WAR&#039;&#039;&#039; - This is the Obsidian Web Admin UI with scheduler component disabled. Configuration will be found at &#039;&#039;INSTALL_PATH&#039;&#039;/standaloneObsidianAdmin.war!/WEB-INF/classes/com.carfey.properties.&lt;br /&gt;
# &#039;&#039;&#039;Standalone Obsidian Runtime&#039;&#039;&#039; - This is a runtime folder containing the libraries and configuration necessary for running the Obsidian Scheduler component either as a standalone module or for use as an Embedded Scheduler in your application. Configuration will be found at &#039;&#039;INSTALL_PATH&#039;&#039;/standalone/obsidian-props.jar!/com.carfey.properties.&lt;br /&gt;
# &#039;&#039;&#039;Obsidian License Proxy&#039;&#039;&#039; - Allows for local license leasing from a [[Key_Server_Proxy|Key Server Proxy]] that ultimately leases licenses from the Obsidian License server.&lt;br /&gt;
# &#039;&#039;&#039;Documentation&#039;&#039;&#039; - README and Embedded API Javadoc.&lt;br /&gt;
# &#039;&#039;&#039;Obsidian Embedded Tomcat JAR&#039;&#039;&#039; — An embedded Apache Tomcat runtime for running Obsidian locally without an external servlet container. Requires the Obsidian WAR pack.&lt;br /&gt;
# &#039;&#039;&#039;Obsidian Standalone Admin Embedded Tomcat JAR&#039;&#039;&#039; — An embedded Apache Tomcat runtime for running the standalone admin WAR locally. Requires the Obsidian Standalone Admin WAR pack.&lt;br /&gt;
# &#039;&#039;&#039;License&#039;&#039;&#039; - Obsidian and 3rd party license information.&lt;br /&gt;
&lt;br /&gt;
==== Deployment options ====&lt;br /&gt;
&lt;br /&gt;
Obsidian 7.0.0 offers four deployment profiles in the installer:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Obsidian WAR&#039;&#039;&#039; — deploy &#039;&#039;&#039;obsidian.war&#039;&#039;&#039; to your own servlet container (Tomcat, WebLogic, etc.).&lt;br /&gt;
* &#039;&#039;&#039;Obsidian Embedded Tomcat JAR&#039;&#039;&#039; — adds an embedded Tomcat runtime and &#039;&#039;&#039;webObsidian&#039;&#039;&#039; scripts to run &#039;&#039;&#039;obsidian.war&#039;&#039;&#039; locally (&#039;&#039;&#039;start scheduler&#039;&#039;&#039;). &#039;&#039;&#039;Requires&#039;&#039;&#039; the Obsidian WAR pack.&lt;br /&gt;
* &#039;&#039;&#039;Obsidian Standalone Admin WAR&#039;&#039;&#039; — admin console WAR for an external servlet container.&lt;br /&gt;
* &#039;&#039;&#039;Obsidian Standalone Admin Embedded Tomcat JAR&#039;&#039;&#039; — embedded runtime for the admin WAR (&#039;&#039;&#039;start adminOnly&#039;&#039;&#039;). &#039;&#039;&#039;Requires&#039;&#039;&#039; the Standalone Admin WAR pack.&lt;br /&gt;
&lt;br /&gt;
Embedded Tomcat does &#039;&#039;&#039;not&#039;&#039;&#039; replace the WAR on disk — it runs the installed WAR via the helper. Do not select an embed pack without its matching WAR pack.&lt;br /&gt;
&lt;br /&gt;
== Obsidian Configuration ==&lt;br /&gt;
&lt;br /&gt;
The installer will guide you through the configuration Obsidian.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Configuring-Obsidian-6.0.0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
First, you must choose what [[Authenticator]] mechanism will be used within Obsidian. &#039;&#039;Native (Database)&#039;&#039; authentication requires no additional configuration and is what most users will select. Select &#039;&#039;Other&#039;&#039; if you have implemented your own authentication mechanism, OAuth (OIDC) to configure OAuth or SAML ,&#039;LDAP&#039;&#039; to configure LDAP settings. &lt;br /&gt;
&lt;br /&gt;
Next, you&#039;ll want to select the email usage type. We highly recommend you configure Obsidian for email use as it will allow you to benefit from the event [[Event_Notifications|notification]] and [[Admin_Notifications|subscription]] support in Obsidian.&lt;br /&gt;
&lt;br /&gt;
Then you&#039;ll configure the log file location, license key (optional) and registered company name (optional). Registered company name is only required for our Site License users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== OAuth / OIDC Configuration ====&lt;br /&gt;
&lt;br /&gt;
If you selected &#039;&#039;&#039;OAuth (OIDC)&#039;&#039;&#039; as the authentication type, the installer displays additional panels for OAuth configuration.&lt;br /&gt;
&lt;br /&gt;
===== Panel: Provider and Common Settings =====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Identity Provider&#039;&#039;&#039; — Select your provider: Keycloak, Microsoft Entra ID, Okta, Auth0, or Generic OIDC.&lt;br /&gt;
* &#039;&#039;&#039;Display name&#039;&#039;&#039; — Label shown on the &amp;quot;Sign in with…&amp;quot; button (e.g. &#039;&#039;Keycloak&#039;&#039;, &#039;&#039;Acme Corp SSO&#039;&#039;). If left blank the button reads &amp;quot;Sign in with SSO&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Redirect URI&#039;&#039;&#039; — The callback URL Obsidian receives after IdP login. Must be registered at the IdP (e.g. &#039;&#039;https://app.example.com/oauth/callback&#039;&#039;).&lt;br /&gt;
* &#039;&#039;&#039;Logout mode&#039;&#039;&#039; — &#039;&#039;local&#039;&#039; (default) or &#039;&#039;rp&#039;&#039; (RP-initiated logout via the IdP&#039;s end_session_endpoint).&lt;br /&gt;
&lt;br /&gt;
===== Panel: Provider-Specific Settings =====&lt;br /&gt;
&lt;br /&gt;
Fill in the connection details for your chosen provider.&lt;br /&gt;
&lt;br /&gt;
;Keycloak&lt;br /&gt;
: &#039;&#039;&#039;Issuer URL&#039;&#039;&#039; — e.g. &#039;&#039;https://keycloak.example.com/realms/myrealm&#039;&#039;. &#039;&#039;&#039;Client ID&#039;&#039;&#039; and &#039;&#039;&#039;Client Secret&#039;&#039;&#039; from the Keycloak client settings. &#039;&#039;&#039;Scopes&#039;&#039;&#039; — recommended: &#039;&#039;openid profile email groups&#039;&#039;. Note: Keycloak does not include a &#039;&#039;groups&#039;&#039; claim by default — a Group Membership mapper must be configured in the client&#039;s Mappers tab.&lt;br /&gt;
&lt;br /&gt;
;Microsoft Entra ID&lt;br /&gt;
: &#039;&#039;&#039;Issuer URL&#039;&#039;&#039; — &#039;&#039;https://login.microsoftonline.com/&amp;lt;tenant-id&amp;gt;/v2.0&#039;&#039;. &#039;&#039;&#039;Client ID&#039;&#039;&#039; — the Application (client) ID from the Azure portal. &#039;&#039;&#039;Client Secret&#039;&#039;&#039; — a client secret value from the Azure portal. &#039;&#039;&#039;Scopes&#039;&#039;&#039; — &#039;&#039;openid profile email&#039;&#039;. Note: the &#039;&#039;groups&#039;&#039; claim contains GUIDs by default; configure Optional Claims in the Azure portal to receive group display names. &#039;&#039;&#039;Multi-tenant applications are not supported in Obsidian 7.0.0.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
;Okta&lt;br /&gt;
: &#039;&#039;&#039;Issuer URL&#039;&#039;&#039; — use the &#039;&#039;&#039;Custom Authorization Server&#039;&#039;&#039; URL, e.g. &#039;&#039;https://&amp;lt;domain&amp;gt;.okta.com/oauth2/default&#039;&#039;. Do &#039;&#039;&#039;not&#039;&#039;&#039; use the Org Authorization Server URL. &#039;&#039;&#039;Client ID&#039;&#039;&#039; and &#039;&#039;&#039;Client Secret&#039;&#039;&#039; from Okta application settings. &#039;&#039;&#039;Scopes&#039;&#039;&#039; — &#039;&#039;openid profile email groups&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
;Auth0&lt;br /&gt;
: &#039;&#039;&#039;Domain / Issuer URL&#039;&#039;&#039; — e.g. &#039;&#039;https://&amp;lt;domain&amp;gt;.auth0.com/&#039;&#039;. &#039;&#039;&#039;Client ID&#039;&#039;&#039; and &#039;&#039;&#039;Client Secret&#039;&#039;&#039; from Auth0 application settings. &#039;&#039;&#039;Scopes&#039;&#039;&#039; — &#039;&#039;openid profile email&#039;&#039;. &#039;&#039;&#039;Important:&#039;&#039;&#039; Auth0 issues opaque access tokens by default which are &#039;&#039;&#039;not supported&#039;&#039;&#039; on Obsidian&#039;s REST/Bearer path — configure a custom API in Auth0 to get JWT access tokens.&lt;br /&gt;
&lt;br /&gt;
;Generic OIDC&lt;br /&gt;
: &#039;&#039;&#039;Issuer URL&#039;&#039;&#039; — the base URL; Obsidian appends &#039;&#039;/.well-known/openid-configuration&#039;&#039; to discover endpoints. &#039;&#039;&#039;Client ID&#039;&#039;&#039; and &#039;&#039;&#039;Client Secret&#039;&#039;&#039; from the provider. &#039;&#039;&#039;Scopes&#039;&#039;&#039; — at minimum &#039;&#039;openid&#039;&#039;; add &#039;&#039;profile&#039;&#039; and your groups scope as needed.&lt;br /&gt;
&lt;br /&gt;
===== Panel: Group → Role Mapping =====&lt;br /&gt;
&lt;br /&gt;
The final OAuth panel maps IdP group values to Obsidian roles. &#039;&#039;&#039;Require role assignment&#039;&#039;&#039; (default yes) — when enabled, users with no matching roles cannot complete browser login. At least one mapping to the &#039;&#039;&#039;Admin&#039;&#039;&#039; role is required. The installer supports up to 10 group→role pairs; additional pairs can be added directly to the configuration file after install. See [[Advanced_Configuration#OAuth_/_OIDC_Authentication_Properties]] for the full property reference.&lt;br /&gt;
&lt;br /&gt;
===== Registering the redirect URI at the IdP =====&lt;br /&gt;
&lt;br /&gt;
Before starting Obsidian, register the redirect URI shown in the installer at your IdP: Keycloak — Client → Settings → Valid Redirect URIs; Entra ID — App Registration → Authentication → Redirect URIs; Okta — Application → General Settings → Sign-in Redirect URIs; Auth0 — Application → Settings → Allowed Callback URLs. The URI must match &#039;&#039;com.carfey.suite.security.OAuthAuthenticator.redirectUri&#039;&#039; exactly, including scheme and port.&lt;br /&gt;
&lt;br /&gt;
==== LDAP Configuration ====&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Configure.LDAP.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you&#039;ve selected LDAP Authentication, this screen takes you through configuring the server address and the various elements used to grant access. You should familiarize yourself with Obsidian [[Authenticator#Roles|Roles]]. The &#039;&#039;Access DN&#039;&#039; configuration element grants Read access to Obsidian application. You may use the same DN for more than one Role should you so wish.&lt;br /&gt;
&lt;br /&gt;
==== Custom Authenticator Configuration====&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Configure.CustomAuthenticator.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you have chosen to use your own authentication mechanism, you must enter the fully qualified classname here.&lt;br /&gt;
&lt;br /&gt;
==== Database Configuration ====&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Database.Configuration.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next comes database configuration. If you are using JNDI, leave the username and password fields blank. If using JDBC URL, username and password fields are required.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;Database connections per instance&#039;&#039; and &#039;&#039;Database connection timeout(millis)&#039;&#039; fields are required and provide directive to the connection pool.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Database table name prefix&#039;&#039; is optional and is typically used when Obsidian will be colocated in an existing database/schema.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Database schema (Oracle/PostgreSQL)&#039;&#039; - This is used to allow for an alternate schema other than the default user&#039;s schema. We also recommend setting this value with Oracle/PostgreSQL when using JNDI as it allows more efficient database metadata loading.&lt;br /&gt;
&lt;br /&gt;
By default, the Obsidian installation will only include the JDBC libraries necessary for your particular database. At times you may wish to include the others to be able to change between databases. In those cases, check &#039;&#039;Include all supported JDBC libs&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Email Configuration ====&lt;br /&gt;
&lt;br /&gt;
If not using JNDI for mail sessions, provide the server and authentication details as required.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Configure.SSL.Email.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Configure.TLS.Email.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Configure.Open.Email.png]]&lt;br /&gt;
&lt;br /&gt;
==== JNDI Configuration ====&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Configure.JNDI.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you have selected JNDI for mail sessions, provide the JNDI path here. If you are using JNDI for Database connections, specify the database type.&lt;br /&gt;
&lt;br /&gt;
==== Configuring 3rd Party Library Conflict Management ====&lt;br /&gt;
[[Image:JarJar-Obsidian-6.0.0.png]]&lt;br /&gt;
&lt;br /&gt;
The Obsidian installer allows you to use [https://code.google.com/archive/p/jarjar JarJar] to handle potential conflicts between Obsidian&#039;s use of 3rd party libraries and versions used within your application. On this screen, simply select which libraries to which you wish to apply the JarJar bytecode modification process. This is optional and is skipped if no libraries are selected. Any jars not listed for which you are using more recent versions can be used and are therefore not included as options in the JarJar processing.&lt;br /&gt;
&lt;br /&gt;
==== Selecting Script Libraries ====&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-6.0.0-Choose-Scripting-Libraries.png]]&lt;br /&gt;
&lt;br /&gt;
The Obsidian installer allows you to select which script libraries you wish to include. Jython and JRuby are incompatible with each other, so the installer will only allow one of the two selected. If all script libraries are deselected, the only script jobs that can be run in Obsidian will be Javascript jobs as that engine is built into Java.&lt;br /&gt;
&lt;br /&gt;
==== Choosing Email Support ====&lt;br /&gt;
As of Obsidian 5.2.0, you can choose between JavaMail (javax) and Jakarta mail (Jakarta EE) implementations. When choosing Jakarta, you can also choose to bundle the Angus Jakarta compatible implementation. &lt;br /&gt;
&lt;br /&gt;
If you are using JNDI, this will only include the relevant support in the Obsidian WAR artifacts and the actual libraries in use must be provided by you and bundled with your container. If the standalone scheduler is selected along with JNDI, JNDI is assumed only relevant for WARs. As such, default libraries for either JavaMail or Jakarta will be included in the standalone installation.&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.EmailImplementation.Configuration.png]]&lt;br /&gt;
&lt;br /&gt;
==== Additional configuration items ====&lt;br /&gt;
&lt;br /&gt;
As of Obsidian 5.5.0, if you require any additional configuration items such as additional appenders/loggers or event hook configurations, you can add them here.&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.5.0.Extra.Configuration.png]]&lt;br /&gt;
&lt;br /&gt;
==== Offline or restricted-network install ====&lt;br /&gt;
&lt;br /&gt;
Obsidian 7.0.0 resolves third-party libraries when you run the installer. For environments without direct access to Maven Central:&lt;br /&gt;
&lt;br /&gt;
# Pre-stage a local dependency cache containing every coordinate listed in the Obsidian dependency inventory for your release (contact Carfey support or your account team for the checklist file matching &#039;&#039;&#039;Obsidian-Install-7.0.0.jar&#039;&#039;&#039;).&lt;br /&gt;
# Copy the cache to the install host. Two layouts are supported:&lt;br /&gt;
#* &#039;&#039;&#039;Flat:&#039;&#039;&#039; one file per installed JAR name directly under the cache root.&lt;br /&gt;
#* &#039;&#039;&#039;File Maven repo:&#039;&#039;&#039; &#039;&#039;&#039;&amp;lt;group&amp;gt;/&amp;lt;artifact&amp;gt;/&amp;lt;version&amp;gt;/&amp;lt;installed-filename&amp;gt;.jar&#039;&#039;&#039;&lt;br /&gt;
# Run the installer with offline mode and the cache directory:&lt;br /&gt;
&lt;br /&gt;
 java -Dobsidian.install.deps.offline=true -Dobsidian.install.deps.cache.dir=/path/to/cache -jar Obsidian-Install-7.0.0.jar&lt;br /&gt;
&lt;br /&gt;
If a required library is missing from the cache, the install stops with an error naming the coordinate — add that artifact to the cache and re-run.&lt;br /&gt;
&lt;br /&gt;
===== Corporate Maven mirror (online) =====&lt;br /&gt;
&lt;br /&gt;
When your site mirrors Maven Central, point the installer at your repository base URL:&lt;br /&gt;
&lt;br /&gt;
 java -Dobsidian.install.deps.repo.url=https://nexus.example.com/repository/maven-public/ -jar Obsidian-Install-7.0.0.jar&lt;br /&gt;
&lt;br /&gt;
The installer reuses resolved artifacts for the duration of one install session.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Completing the Installation ==&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Finished.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Once you&#039;ve completed the Installation and Configuration screens, fully configured Obsidian Scheduler artifacts are now ready for you to use in the installation path you selected.&lt;br /&gt;
&lt;br /&gt;
Should you wish to automate future installations with the same configuration, click &#039;&#039;Generate an automatic installation script&#039;&#039;. This will prompt you to save an XML file that can be used for future installations using the automated install procedure &amp;lt;code&amp;gt;java -jar Obsidian-Install-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;.jar my-obsidian-configuration.xml&amp;lt;/code&amp;gt;. Every effort is made to ensure compatibility of these automated install files between versions. Any incompatibility will be noted in the [[Release_Notes|Release Notes]]. These automated installer files can also be used as templates for other environments, modifying them as necessary.&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Getting_Started&amp;diff=4091</id>
		<title>Getting Started</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Getting_Started&amp;diff=4091"/>
		<updated>2026-07-09T20:38:37Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This Getting Started is for Obsidian 4.0 and newer versions. See the [[Getting_Started_(3.x.x_and_earlier)|Previous Getting Started]] for prior versions.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This guide will help you choose a deployment setup that works for you, and then get it running. Before reading this page, you may wish to review Obsidian&#039;s [[Deployment Models]] to understand the different parts of Obsidian or to find out what deployment model works for you.&lt;br /&gt;
&lt;br /&gt;
If you&#039;ve are looking to start writing your own Obsidian jobs, see [[Implementing Jobs]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Supported Platforms =&lt;br /&gt;
&lt;br /&gt;
Please quickly review our supported platforms before continuing.&lt;br /&gt;
&lt;br /&gt;
* Obsidian is OS-independent, and runs on the Java Virtual Machine. It works in a variety of environments, including Linux, OSX and Windows, and can be run inside virtual machines.&lt;br /&gt;
* Obsidian 5.x.x and 6.x.x run on Java 11 or above (Obsidian 4.x.x runs on Java 1.7 or above)&lt;br /&gt;
* Obsidian&#039;s administration web application is a servlet application.&lt;br /&gt;
** 7.x.x has been tested on Tomcat 10.x&lt;br /&gt;
** 6.x.x has been tested on Tomcat 10.x and Jetty 11.x (Jakarta Servlet 5.0)&lt;br /&gt;
** 5.x.x has been tested on Tomcat 9.x and Jetty 10.x (Javax Servlet 4.0)&lt;br /&gt;
** 4.x.x has been tested on Tomcat 7, 8 &amp;amp; 8.5 and Jetty 9.x (Javax Servlet 4.0)&lt;br /&gt;
* It works on all modern browsers and is tested on recent versions of Chrome, Edge and Firefox.&lt;br /&gt;
* Obsidian requires one of the following fully-supported database platforms:&lt;br /&gt;
** MySQL 8.0.x (Obsidian 5.x and higher), 5.5-5.7 (excluding Galera)&lt;br /&gt;
** MariaDB 5.5&lt;br /&gt;
** Oracle 18c, 19c, 21c on Obsidian 5.x and higher&lt;br /&gt;
** Oracle 10g, 11.x, 12c on versions prior to Obsidian 5.0.0&lt;br /&gt;
** PostgreSQL 11-16 on Obsidian 5.x and higher&lt;br /&gt;
** PostgreSQL 9, 10&lt;br /&gt;
** MS SQL Server 2008-2019&lt;br /&gt;
** H2 1.4. &lt;br /&gt;
** &#039;&#039;Larger major versions are likely to work without issues but are not officially supported.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; With some exceptions, clustered scheduler instances require access to contact license servers over the Internet, or access to an internal proxy license server. See [[Licenses &amp;amp; Nodes]] for more information.&lt;br /&gt;
&lt;br /&gt;
== Hardware Requirements ==&lt;br /&gt;
&lt;br /&gt;
We recommend the following minimum hardware for typical installations:&lt;br /&gt;
&lt;br /&gt;
* 1 GHz processor&lt;br /&gt;
* 2 GB RAM&lt;br /&gt;
* 1 GB hard disk space (excluding accumulated logs)&lt;br /&gt;
&lt;br /&gt;
Note that actual requirements may vary depending on job volume, clustering and other factors.&lt;br /&gt;
&lt;br /&gt;
= Choose Your Installation Type =&lt;br /&gt;
&lt;br /&gt;
Obsidian consists of two main processes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scheduler&#039;&#039;&#039; - schedules and executes jobs, sends notifications, etc. Also exposes the [[Embedded API]].&lt;br /&gt;
* &#039;&#039;&#039;Admin Web Application&#039;&#039;&#039; - provides management and monitoring UI, plus the [[REST API]] and [[Embedded API]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These can be run together or separately in the following configurations. You will pick one or more of these options together to provide both the scheduler and admin web application functionality.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Standalone Scheduler&#039;&#039;&#039; - A Java process that performs job execution. A standalone scheduler installation is generated when you run the Obsidian installer, and may be customized by adding JAR files containing your job code. It is started and stopped by scripts included with the installation. Requires a separate admin web application to be deployed.&lt;br /&gt;
# &#039;&#039;&#039;Embedded Scheduler&#039;&#039;&#039; - Provides job execution like a standalone scheduler, but instead runs as a process embedded within and started from your application. This eliminates the need to customize and deploy a separate artifact which will perform job execution. Requires a separate admin web application to be deployed.&lt;br /&gt;
# &#039;&#039;&#039;Standalone Admin Web Application&#039;&#039;&#039; - A Java servlet application providing Obsidian&#039;s administration capabilities but no scheduling services.  A standalone admin application WAR file is generated when you run the Obsidian installer, and may be customized by adding JAR files containing your job code.  Requires a separate standalone, embedded or combined scheduler and web application to be deployed for job execution to be performed.&lt;br /&gt;
# &#039;&#039;&#039;Combined Scheduler and Admin Web Application&#039;&#039;&#039; - A version of the admin web application which also runs a scheduler service for job execution. A combined scheduler and admin application WAR file is generated when you run the Obsidian installer, and may be customized by adding JAR files containing your job code. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Regardless of the deployment configuration, any time you run more than one scheduler process operating against the same Obsidian database, they will automatically form a cluster and share in job execution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Choosing which installation type works best for you depends on your specific needs. The setups which are suitable for most cases are, in order: &lt;br /&gt;
&lt;br /&gt;
* Using an &#039;&#039;&#039;Embedded Scheduler&#039;&#039;&#039; (option 2), along with a &#039;&#039;&#039;Standalone Admin Web Application&#039;&#039;&#039; (option 3). This approach lets you embed Obsidian into your existing application without having to alter the Obsidian artifacts to include your job code. Instead, Obsidian&#039;s required libraries are included in your application and they are deployed together.&lt;br /&gt;
* Using a  &#039;&#039;&#039;Combined Scheduler and Admin Web Application&#039;&#039;&#039; (option 4) alone or in a cluster. This is suitable if you don&#039;t have another application containing job code for Obsidian to execute, or if you simply want to use Obsidian&#039;s scripting support, which doesn&#039;t require deploying JAR files.&lt;br /&gt;
&lt;br /&gt;
= Downloading Obsidian =&lt;br /&gt;
Just go to our [https://web.obsidianscheduler.com/download/ download page], and grab the latest Obsidian&#039;s installation zip file. There is no need to register or obtain a license before downloading.&lt;br /&gt;
&lt;br /&gt;
Once you&#039;ve downloaded the zip file, extract it to a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
If you are trying to upgrade to a newer version of Obsidian, see [[Upgrading_Obsidian|upgrade]] instructions.&lt;br /&gt;
&lt;br /&gt;
= Quick Start for Evaluation Purposes =&lt;br /&gt;
&lt;br /&gt;
If you wish to quickly try Obsidian without minimal setup required, follow these steps. Otherwise, skip ahead to [[#Initial Setup|Initial Setup]].&lt;br /&gt;
&lt;br /&gt;
== Really Quick Method Using Embedded Database ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;We do not recommend this setup for production use. &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Ensure you have a JDK (11 or up for Obsidian 6.x.x &amp;amp; 5.x.x, 1.7 or up for Obsidian 4.x.x) installed and that the &amp;lt;code&amp;gt;JAVA_HOME&amp;lt;/code&amp;gt; environment variable is set to your JDK installation directory.&lt;br /&gt;
# Unzip the Obsidian download zip file to a directory of your choice.&lt;br /&gt;
# At the command line, in the zip extraction directory, run the [[Installation_Guide|installer]] using this command, substituting the appropriate Obsidian version number: &amp;lt;code&amp;gt;java -jar Obsidian-Install-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;.jar h2-tomcat-quick-start.xml&amp;lt;/code&amp;gt;&lt;br /&gt;
# Start Obsidian using the command: &amp;lt;code&amp;gt;./webObsidian.sh start scheduler&amp;lt;/code&amp;gt; for Linux or &amp;lt;code&amp;gt;webObsidian.bat start scheduler&amp;lt;/code&amp;gt; for Windows.&lt;br /&gt;
# Go to http://localhost:8080 in your browser and check out your fully functional Obsidian web application and scheduler! You can log in to the admin web application with the default user &#039;&#039;admin&#039;&#039; and password &#039;&#039;changeme&#039;&#039;.&lt;br /&gt;
# When you&#039;re done, stop Obsidian using the command: &amp;lt;code&amp;gt;./webObsidian.sh stop&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;webObsidian.bat stop&amp;lt;/code&amp;gt; for Windows.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; If you restart the Quick Start installation and see &amp;quot;lock wait timeout&amp;quot; or similar errors in the log screen, you may have to delete your embedded H2 database lock file. By default, the file name is &#039;&#039;obsidian.lock.db&#039;&#039; and is located in the user home directory.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; If you see a &amp;lt;code&amp;gt;java.net.BindException: Permission denied&amp;lt;/code&amp;gt; error on startup, you will need to use an alternate port. See [[Troubleshooting]] for details on how to change this.&lt;br /&gt;
&lt;br /&gt;
== Quick Method Using Existing Database ==&lt;br /&gt;
&lt;br /&gt;
If you wish to get Obsidian running quickly using a database platform you already have running, follow these steps:&lt;br /&gt;
&lt;br /&gt;
# Ensure you have a JDK (11 or up for Obsidian 6.x.x and 5.x.x, 1.7 or up for Obsidian 4.x.x) installed and that the &amp;lt;code&amp;gt;JAVA_HOME&amp;lt;/code&amp;gt; environment variable is set to your JDK installation directory.&lt;br /&gt;
# Unzip the Obsidian download zip file to a directory of your choice.&lt;br /&gt;
# At the command line, in the zip extraction directory, run the [[Installation_Guide|installer]] using this command, substituting the appropriate Obsidian version number: &amp;lt;code&amp;gt;java -jar Obsidian-Install-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;.jar&amp;lt;/code&amp;gt;&lt;br /&gt;
# Start Obsidian using the command: &amp;lt;code&amp;gt;./webObsidian.sh start scheduler&amp;lt;/code&amp;gt; for Linux or &amp;lt;code&amp;gt;webObsidian.bat start scheduler&amp;lt;/code&amp;gt; for Windows.&lt;br /&gt;
# Go to http://localhost:8080 in your browser and check out your fully functional Obsidian web application and scheduler! You can log in to the admin web application with the default user &#039;&#039;admin&#039;&#039; and password &#039;&#039;changeme&#039;&#039;.&lt;br /&gt;
# When you&#039;re done, stop Obsidian using the command: &amp;lt;code&amp;gt;./webObsidian.sh stop&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;webObsidian.bat stop&amp;lt;/code&amp;gt; for Windows.&lt;br /&gt;
&lt;br /&gt;
= Initial Setup  =&lt;br /&gt;
&lt;br /&gt;
This section covers the setup required after you&#039;ve selected your [[#Choose_Your_Installation_Type|installation type]]. &lt;br /&gt;
&lt;br /&gt;
== Database ==&lt;br /&gt;
&lt;br /&gt;
Obsidian requires a database which must be created before running Obsidian. Multiple [[#Supported Platforms|database platforms]] are supported. Obsidian can share a database/schema with another application.&lt;br /&gt;
&lt;br /&gt;
Note that the database must exist before deployment, but by default Obsidian will automatically create all required tables.&lt;br /&gt;
&lt;br /&gt;
Later, you will specify database connection parameters within Obsidian&#039;s installer to tell it how to connect. If you need to configure advanced settings or change settings directly after you&#039;ve run run the installer, see [[Advanced Configuration]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Obsidian needs to create the tables in the target database. If the schema is shared with your application’s tables, please ensure there are no name conflicts. If there are conflicts, separate schemas/databases can be used, or a table prefix can be specified as shown in [[Advanced_Configuration#Database_Properties|Advanced Configuration]]. [[Obsidian Tables]] lists the tables Obsidian will created upon first deployment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Manual Schema Creation ===&lt;br /&gt;
&lt;br /&gt;
When you start Obsidian, it will automatically detect and create missing tables in your target database. However, if you wish to run Obsidian with a database user that does not have create privileges, or simply wish to prepare your database structure ahead of time, you can use the database scripts provided with your download zip file under the &amp;quot;db_scripts&amp;quot; directory.&lt;br /&gt;
&lt;br /&gt;
First create your database, and locate the &amp;quot;complete.sql&amp;quot; file under the directory for the database you are using under the &amp;quot;db_scripts&amp;quot; directory. Statements within this file contain the token &amp;quot;$px$&amp;quot; to enable table prefixes. Before you run the SQL file, replace all instances of the token &amp;quot;$px$&amp;quot; (without quotes) with a table prefix 6 characters or shorter (letters and underscores supported), or with blank.&lt;br /&gt;
&lt;br /&gt;
Then, in your SQL client of choice, execute the script and all the required Obsidian tables will be created.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Alternate Oracle Schemas ===&lt;br /&gt;
&lt;br /&gt;
After allowing Obsidian to create all the required tables and initial data by deploying it a single time, Obsidian can be run with an alternate Oracle user by specifying the target schema on Oracle databases. See [[Advanced_Configuration#Database_Properties|Advanced Configuration]] for the property to set.&lt;br /&gt;
&lt;br /&gt;
If you use a separate user from the schema owner, you must grant the user [[Obsidian_Tables#Oracle Privileges|certain privileges]] for Obsidian to function correctly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MS SQL Server Snapshot Isolation ===&lt;br /&gt;
&lt;br /&gt;
For maximum compatibility and to avoid deadlocks, MS SQL Server should be configured to use [https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/sql/snapshot-isolation-in-sql-server read committed snapshot isolation].&lt;br /&gt;
&lt;br /&gt;
This can be enabled on your database by running the following commands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER DATABASE MyDatabase SET ALLOW_SNAPSHOT_ISOLATION ON&lt;br /&gt;
ALTER DATABASE MyDatabase SET READ_COMMITTED_SNAPSHOT ON&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
&lt;br /&gt;
By default, Obsidian manages its own set users and logins to restrict access to the admin web application and REST API. A default “admin” user is created when the scheduler is first deployed and no additional setup is required.&lt;br /&gt;
&lt;br /&gt;
Alternatively, to use LDAP authentication, select the LDAP option in the installer and enter your LDAP details.&lt;br /&gt;
&lt;br /&gt;
As of 7.0.0, you can also select OAuth / OIDC authentication to enable Single Sign-On via an external identity provider. See [[Authenticator#OAuthAuthenticator_(OIDC_SSO)|OAuthAuthenticator]] for details.&lt;br /&gt;
&lt;br /&gt;
Finally, you may implement your own [[authenticator|custom authenticator]] Java class, which you also enter when running the installer.&lt;br /&gt;
&lt;br /&gt;
= Running the Installer =&lt;br /&gt;
&lt;br /&gt;
Now that you&#039;ve chosen your installation type and performed initial setup of your database and authentication, you can run Obsidian&#039;s installer to configure and build a set of artifacts that you can either use to embed Obsidian, or deploy directly.&lt;br /&gt;
&lt;br /&gt;
To run the installer, please follow our detailed [[Installation_Guide|installation guide]].&lt;br /&gt;
&lt;br /&gt;
=== Installer-Created Artifacts ===&lt;br /&gt;
&lt;br /&gt;
Once you&#039;ve run the installer, your installation directory will look something like the following, depending on which artifacts you chose to generate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
├───db_scripts&lt;br /&gt;
└───Obsidian-7.0.0&lt;br /&gt;
    │   com.carfey.yaml.reference&lt;br /&gt;
    │   obsidian.war&lt;br /&gt;
    │   obsidian-builtin-job-src.jar&lt;br /&gt;
    │   obsidianForkedJob.bat&lt;br /&gt;
    │   obsidianForkedJob.sh&lt;br /&gt;
    │   obsidian-javadoc.zip&lt;br /&gt;
    │   standaloneObsidian.bat&lt;br /&gt;
    │   standaloneObsidian.sh&lt;br /&gt;
    │   standaloneObsidianAdmin.war&lt;br /&gt;
    │   webObsidian.bat&lt;br /&gt;
    │   webObsidian.sh&lt;br /&gt;
    │&lt;br /&gt;
    ├───embed-tomcat-lib  (present when an Embedded Tomcat pack is selected)&lt;br /&gt;
    ├───license&lt;br /&gt;
    ├───logs&lt;br /&gt;
    └───standalone&lt;br /&gt;
        (various JAR files...)&lt;br /&gt;
        obsidian-yaml-configuration.jar&lt;br /&gt;
        obsidian.jar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The installer creates a top-level directory named &#039;&#039;&#039;Obsidian-n.n.n&#039;&#039;&#039; containing generated artifacts. The key files and directories are:&lt;br /&gt;
&lt;br /&gt;
; com.carfey.yaml.reference or com.carfey.properties.reference&lt;br /&gt;
: Copy of the configuration file generated by the installer.&lt;br /&gt;
; obsidian.war&lt;br /&gt;
: Combined scheduler and admin web application WAR. Deploy directly to a servlet container, or run locally using the Embedded Tomcat pack (see below). Customise by adding your job code and dependencies as JARs to &#039;&#039;&#039;/WEB-INF/lib&#039;&#039;&#039; within the archive.&lt;br /&gt;
; standaloneObsidian.bat and standaloneObsidian.sh&lt;br /&gt;
: Windows and Linux scripts to start the standalone scheduler process with no web application. Customise by adding your job code and dependencies as JARs to the &#039;&#039;&#039;standalone&#039;&#039;&#039; directory.&lt;br /&gt;
; webObsidian.bat and webObsidian.sh&lt;br /&gt;
: Windows and Linux scripts to start Obsidian using the embedded Tomcat runtime (requires the &#039;&#039;&#039;Obsidian Embedded Tomcat JAR&#039;&#039;&#039; or &#039;&#039;&#039;Obsidian Standalone Admin Embedded Tomcat JAR&#039;&#039;&#039; pack). Use &#039;&#039;&#039;start scheduler&#039;&#039;&#039; to run the combined scheduler+admin WAR, or &#039;&#039;&#039;start adminOnly&#039;&#039;&#039; to run the standalone admin WAR. Stop with &#039;&#039;&#039;stop&#039;&#039;&#039;.&lt;br /&gt;
; standaloneObsidianAdmin.war&lt;br /&gt;
: Standalone admin web application WAR (no scheduler). Deploy directly to a servlet container or run via the embedded Tomcat pack.&lt;br /&gt;
; embed-tomcat-lib&lt;br /&gt;
: Present when an Embedded Tomcat pack is selected. Contains the embedded Tomcat runtime JARs used by the &#039;&#039;&#039;webObsidian&#039;&#039;&#039; scripts.&lt;br /&gt;
; standalone&lt;br /&gt;
: Directory containing JARs required to run the standalone scheduler process. &#039;&#039;&#039;obsidian-yaml-configuration.jar&#039;&#039;&#039; or &#039;&#039;&#039;obsidian-properties-configuration.jar&#039;&#039;&#039; contains the Obsidian configuration file. To make configuration changes for the standalone scheduler, update the configuration file within this JAR.&lt;br /&gt;
&lt;br /&gt;
= Starting Obsidian with embedded Tomcat =&lt;br /&gt;
&lt;br /&gt;
If you selected the &#039;&#039;&#039;Obsidian Embedded Tomcat JAR&#039;&#039;&#039; or &#039;&#039;&#039;Obsidian Standalone Admin Embedded Tomcat JAR&#039;&#039;&#039; pack during installation, use the &#039;&#039;&#039;webObsidian&#039;&#039;&#039; scripts to start and stop Obsidian.&lt;br /&gt;
&lt;br /&gt;
From the Obsidian install directory:&lt;br /&gt;
&lt;br /&gt;
 webObsidian.bat start scheduler&lt;br /&gt;
 (Unix: ./webObsidian.sh start scheduler)&lt;br /&gt;
&lt;br /&gt;
For standalone admin only:&lt;br /&gt;
&lt;br /&gt;
 webObsidian.bat start adminOnly&lt;br /&gt;
&lt;br /&gt;
Stop:&lt;br /&gt;
&lt;br /&gt;
 webObsidian.bat stop&lt;br /&gt;
 (Unix: ./webObsidian.sh stop)&lt;br /&gt;
&lt;br /&gt;
Default HTTP port is &#039;&#039;&#039;8080&#039;&#039;&#039;. To change ports, pass &#039;&#039;&#039;-Dembedded.tomcat.http.port&#039;&#039;&#039;, &#039;&#039;&#039;-Dembedded.tomcat.stop.port&#039;&#039;&#039;, and &#039;&#039;&#039;-Dembedded.tomcat.stop.key&#039;&#039;&#039; as JVM arguments before starting.&lt;br /&gt;
&lt;br /&gt;
If you are deploying &#039;&#039;&#039;obsidian.war&#039;&#039;&#039; to your own external servlet container instead, refer to your container&#039;s deployment documentation.&lt;br /&gt;
&lt;br /&gt;
= Embedding Obsidian &amp;amp; Customizing Artifacts =&lt;br /&gt;
&lt;br /&gt;
The Obsidian scheduler process needs Java classpath access to your jobs so it can detect valid jobs and execute them. This requires a bit of customization before you are ready to run custom Java jobs. If you still haven&#039;t created your custom jobs, consult [[Implementing Jobs]] before proceeding. If you only intend to use [[Scripting Jobs]], customization will not be required and you can skip to [[#Deployment|Deployment]].&lt;br /&gt;
&lt;br /&gt;
If you want to embed Obsidian into your application or need to deploy jobs and their dependent libraries to the generated Obsidian artifacts, follow the steps in the appropriate sections below.&lt;br /&gt;
&lt;br /&gt;
Note that only Obsidian scheduler processes need to be customized to include your job code. The admin web application itself does not require classpath access to your jobs.&lt;br /&gt;
&lt;br /&gt;
== Embedding Obsidian - Importing Libraries and Properties File ==&lt;br /&gt;
&lt;br /&gt;
To embed Obsidian, you will need to update your application build to bring in the JAR files it requires, along with the Obsidian properties file. Simply follow these steps:&lt;br /&gt;
&lt;br /&gt;
# Import all required [[Advanced_Configuration#Dependent_Libraries|Obsidian JAR files]] into your project and reference them in your build files. &lt;br /&gt;
#* These can be obtained from the &amp;lt;code&amp;gt;standalone&amp;lt;/code&amp;gt; directory of your installation. Make sure you &#039;&#039;&#039;exclude&#039;&#039;&#039; &amp;lt;code&amp;gt;obsidian-(yaml/properties)-configuration.jar&amp;lt;/code&amp;gt;&lt;br /&gt;
#* Ensure your Maven, Gradle or Ant files are updated to include all required libraries in your build, along with your IDE.&lt;br /&gt;
# Make a copy of &amp;lt;code&amp;gt;com.carfey.yaml.reference&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;com.carfey.properties.reference&amp;lt;/code&amp;gt; from your installation with the &amp;lt;code&amp;gt;.reference&amp;lt;/code&amp;gt; suffix removed, and add it to your project&#039;s classpath.&lt;br /&gt;
#* This is typically just a matter of adding it to your project&#039;s resources directory.&lt;br /&gt;
#* From now on, you can update this file to change the various configuration options such as database connection details.&lt;br /&gt;
#* You may wish to leave this file out of source control and let developers configure their own installations. However, any running Obsidian instance will need access to a valid [[Advanced_Configuration#Properties.2FYaml_File|properties file]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Maven users:&#039;&#039;&#039; Note that we do not publish Maven artifacts for Obsidian, so you will not be able to include them by referencing a public repository.&lt;br /&gt;
&lt;br /&gt;
== Adding Custom Jobs to Standalone Scheduler ==&lt;br /&gt;
&lt;br /&gt;
In order for the standalone scheduler to detect and execute custom jobs written in Java, you will need to ensure Obsidian&#039;s classpath contains the compiled job code, along with its dependencies.&lt;br /&gt;
&lt;br /&gt;
To do so, you need to perform just one step before starting the standalone scheduler:&lt;br /&gt;
&lt;br /&gt;
# Copy JAR files containing custom Obsidian jobs and all runtime dependencies to the &amp;lt;code&amp;gt;standalone&amp;lt;/code&amp;gt; directory in your installation.&lt;br /&gt;
#* These JARs should be alongside &amp;lt;code&amp;gt;obsidian.jar&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* All JAR files in this directory will be automatically added to the classpath when run via the &amp;lt;code&amp;gt;standaloneObsidian.sh&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;standaloneObsidian.bat&amp;lt;/code&amp;gt; scripts.&lt;br /&gt;
&lt;br /&gt;
== Adding Custom Jobs to Combined Scheduler and Admin Web Application ==&lt;br /&gt;
&lt;br /&gt;
In order for the combined scheduler and admin web application to detect and execute custom jobs written in Java, you will need to ensure Obsidian&#039;s classpath contains the compiled job code, along with its dependencies.&lt;br /&gt;
&lt;br /&gt;
To do so, you need to perform just one step before deploying the Obsidian WAR file:&lt;br /&gt;
&lt;br /&gt;
# Copy JAR files containing custom Obsidian jobs and all runtime dependencies to the &amp;lt;code&amp;gt;WEB-INF/lib&amp;lt;/code&amp;gt; directory within the WAR archive.&lt;br /&gt;
#* These JARs should be alongside &amp;lt;code&amp;gt;obsidian.jar&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* WAR files use the ZIP format and can be extracted and recompressed with normal ZIP tools or the JDK &amp;lt;code&amp;gt;jar&amp;lt;/code&amp;gt; utility.&lt;br /&gt;
&lt;br /&gt;
== Updating the Properties File in Admin Web Applications ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Note that updating the WAR artifact is not necessary to perform properties file changes when using an external properties file as described [[Advanced_Configuration#Properties_File|here]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you need to change [[Advanced_Configuration#Properties_File|configuration properties]] for a standalone admin web application or combined scheduler and admin web application, follow these steps:&lt;br /&gt;
&lt;br /&gt;
# Obtain the WAR artifact from your installation that requires changes. This is either &amp;lt;code&amp;gt;obsidian.war&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;standaloneObsidianAdmin.war&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Extract the WAR file to a clean directory.&lt;br /&gt;
# Edit the &amp;lt;code&amp;gt;com.carfey.(yaml/properties)&amp;lt;/code&amp;gt; file within the subdirectory &amp;lt;code&amp;gt;WEB-INF/classes&amp;lt;/code&amp;gt; and save your changes.&lt;br /&gt;
# Rebundled the WAR artifact using a zip utility or the JDK &amp;lt;code&amp;gt;jar&amp;lt;/code&amp;gt; utility.&lt;br /&gt;
#* Some zip utilities such as 7Zip will allow you to edit files within an archive directly without the previous steps. It is generally safe to do so.&lt;br /&gt;
&lt;br /&gt;
= Deployment =&lt;br /&gt;
&lt;br /&gt;
You are now ready to deploy your scheduler and/or admin web application.&lt;br /&gt;
&lt;br /&gt;
== Embedded Scheduler ==&lt;br /&gt;
&lt;br /&gt;
When Obsidian is embedded, there is no separate deployment process. However, you will need to start and stop Obsidian with your application. If you are using Spring, we recommend you use our [[Spring Integration]] instead, which will automatically start and stop the scheduler for you.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
During your application startup, once it is fully initialized (or as close as possible), start Obsidian, and save a reference to the returned result so you can shut it down later:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// This will start the scheduler on the first call to get().&lt;br /&gt;
&lt;br /&gt;
com.carfey.ops.job.SchedulerStarter starter = com.carfey.ops.job.SchedulerStarter.get(com.carfey.ops.job.SchedulerStarter.SchedulerMode.EMBEDDED);&lt;br /&gt;
&lt;br /&gt;
// ...&lt;br /&gt;
&lt;br /&gt;
// Later, we need to gracefully shut down the scheduler &lt;br /&gt;
starter.shutDown();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will run Obsidian&#039;s scheduler process, but will not include any of the web application or the REST API. This functionality is provided by the admin web application.&lt;br /&gt;
&lt;br /&gt;
== Standalone Admin Web Application ==&lt;br /&gt;
&lt;br /&gt;
To deploy the standalone admin web application, simply deploy the &amp;lt;code&amp;gt;standaloneObsidianAdmin.war&amp;lt;/code&amp;gt; file your servlet container of choice (e.g. Tomcat) after configuring it appropriately. You may rename the WAR file to have it deployed under a different context path, if desired (e.g. &amp;quot;ROOT.war&amp;quot; or &amp;quot;obsidian.war&amp;quot;). Consult your servlet documentation to find out how to deploy the application and start the servlet container.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; If you want to use the included Jetty server as your servlet container, you can use the scripts included in your installation instead of deploying the WAR. This will make the application accessible at http://localhost:8080.&lt;br /&gt;
* To start &lt;br /&gt;
** Linux: &amp;lt;code&amp;gt;./webObsidian.sh start adminOnly&amp;lt;/code&amp;gt;&lt;br /&gt;
** Windows: &amp;lt;code&amp;gt;webObsidian.bat start adminOnly&amp;lt;/code&amp;gt;&lt;br /&gt;
* To stop&lt;br /&gt;
** Linux: &amp;lt;code&amp;gt;./webObsidian.sh stop&amp;lt;/code&amp;gt; &lt;br /&gt;
** Windows: &amp;lt;code&amp;gt;webObsidian.bat stop&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Security Note:&#039;&#039;&#039; By default, the admin web application allows non-secure connections. If you wish to force secure connections through HTTPS, you can edit the web.xml in your war and uncomment the &amp;lt;security-constraint&amp;gt; element in the file. This will force all requests to redirect to an encrypted connection. For details on setting up SSL on your servlet container, refer to its documentation.&lt;br /&gt;
&lt;br /&gt;
== Standalone Scheduler ==&lt;br /&gt;
&lt;br /&gt;
To deploy and run the standalone scheduler, you may use the provided scripts in your installation directory:&lt;br /&gt;
* Linux: &amp;lt;code&amp;gt;./standaloneObsidian.sh start&amp;lt;/code&amp;gt;&lt;br /&gt;
* Windows: &amp;lt;code&amp;gt;standaloneObsidian.bat start&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You should always stop Obsidian gracefully when possible by using:&lt;br /&gt;
* Linux: &amp;lt;code&amp;gt;./standaloneObsidian.sh stop&amp;lt;/code&amp;gt;&lt;br /&gt;
* Windows: &amp;lt;code&amp;gt;standaloneObsidian.bat stop&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Both the start and stop commands may be supplied an additional argument to override the &amp;lt;code&amp;gt;listenerPort&amp;lt;/code&amp;gt; which defaults to 10451.&lt;br /&gt;
&lt;br /&gt;
Rather than use one of the provided scripts, you can invoke the equivalent Java command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java com.carfey.ops.job.SchedulerStarter start &amp;lt;listenerPort&amp;gt;&lt;br /&gt;
java com.carfey.ops.job.SchedulerStarter stop &amp;lt;listenerPort&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Combined Scheduler and Admin Web Application ==&lt;br /&gt;
&lt;br /&gt;
To deploy the combined scheduler and admin web application, simply deploy the &amp;lt;code&amp;gt;obsidian.war&amp;lt;/code&amp;gt; file your servlet container of choice (e.g. Tomcat) after configuring it appropriately. You may rename the WAR file to have it deployed under a different context path, if desired (e.g. &amp;quot;ROOT.war&amp;quot;). Consult your servlet documentation to find out how to deploy the application and start the servlet container.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; If you want to use the included Jetty server as your servlet container, you can use the scripts included in your installation instead of deploying the WAR.  This will make the web application accessible at the URL http://localhost:8080.&lt;br /&gt;
&lt;br /&gt;
* To start &lt;br /&gt;
** Linux: &amp;lt;code&amp;gt;./webObsidian.sh start scheduler&amp;lt;/code&amp;gt;&lt;br /&gt;
** Windows: &amp;lt;code&amp;gt;webObsidian.bat start scheduler&amp;lt;/code&amp;gt;&lt;br /&gt;
* To stop&lt;br /&gt;
** Linux: &amp;lt;code&amp;gt;./webObsidian.sh stop&amp;lt;/code&amp;gt; &lt;br /&gt;
** Windows: &amp;lt;code&amp;gt;webObsidian.bat stop&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Security Note:&#039;&#039;&#039; By default, the admin web application allows non-secure connections. If you wish to force secure connections through HTTPS, you can edit the web.xml in your war and uncomment the &amp;lt;security-constraint&amp;gt; element in the file. This will force all requests to redirect to an encrypted connection. For details on setting up SSL on your servlet container, refer to its documentation.&lt;br /&gt;
&lt;br /&gt;
== Embedding the Obsidian Web Application in Another Web Application ==&lt;br /&gt;
&lt;br /&gt;
We do not generally recommend attempting to merge the Obsidian admin web application with another servlet web application, but it can be done by following these steps:&lt;br /&gt;
&lt;br /&gt;
To embed the full Obsidian web application in an existing web application, you will need to extract the necessary sections from the &amp;lt;code&amp;gt;WEB-INF/web.xml&amp;lt;/code&amp;gt; file in the &amp;lt;code&amp;gt;obsidian.war&amp;lt;/code&amp;gt; file and merge them into your application&#039;s &amp;lt;code&amp;gt;web.xml&amp;lt;/code&amp;gt; file. This includes all &amp;quot;listener&amp;quot;, &amp;quot;servlet&amp;quot;, &amp;quot;servlet-mapping&amp;quot;, &amp;quot;jsp-config&amp;quot;, &amp;quot;filter&amp;quot;, &amp;quot;filter-mapping&amp;quot; elements, and optionally &amp;quot;welcome-file-list&amp;quot; and &amp;quot;error-page&amp;quot; elements. Ensure that all servlet paths are maintained. If you are using a different servlet specification version, you may need to update the mappings to the appropriate format.&lt;br /&gt;
&lt;br /&gt;
Note the use of our &amp;lt;code&amp;gt;com.carfey.ops.servlet.StartupShutdownListener&amp;lt;/code&amp;gt; which takes care of starting up the scheduler instance and using the web container&#039;s default shutdown mechanism to ensure graceful shutdown. This listener will start Obsidian&#039;s scheduler process and initialize the Obsidian web application. &lt;br /&gt;
&lt;br /&gt;
If you wish to embed Obsidian&#039;s web application without the scheduler running, include the following parameter element in your &amp;lt;code&amp;gt;web.xml&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;context-param&amp;gt;&lt;br /&gt;
   &amp;lt;param-name&amp;gt;schedulerEnabled&amp;lt;/param-name&amp;gt;&lt;br /&gt;
   &amp;lt;param-value&amp;gt;false&amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Additional Deployment Details ==&lt;br /&gt;
&lt;br /&gt;
=== Classpath Notes ===&lt;br /&gt;
&lt;br /&gt;
To run a scheduler with your custom code and jobs, you need to ensure the scheduler process classpath includes your code packaged into JAR files, as described [[#Embedding_Obsidian_.26_Customizing_Artifacts|above]]. &lt;br /&gt;
&lt;br /&gt;
If a compiled job is updated, you will have to restart your application or the servlet container after deploying updated jars, unless you are using [[Job Forking]].&lt;br /&gt;
&lt;br /&gt;
=== Setting Host Names ===&lt;br /&gt;
Obsidian instances will automatically assign themselves host names if no host name is explicitly set, but you may wish to give them explicit names to make scheduling and monitoring simpler.&lt;br /&gt;
&lt;br /&gt;
If you wish to assign explicit names, simply set the Java system property &amp;lt;code&amp;gt;schedulerDesignation&amp;lt;/code&amp;gt; to the host name of your choice. For example, if starting an instance using the standalone scheduler using &amp;lt;code&amp;gt;java&amp;lt;/code&amp;gt; directly, simply add the value &amp;lt;code&amp;gt;-DschedulerDesignation=myHostName&amp;lt;/code&amp;gt; to the end of the command.&lt;br /&gt;
&lt;br /&gt;
You may also use a properties file setting for the host name as detailed in [[Advanced Configuration]].&lt;br /&gt;
&lt;br /&gt;
=== Disabling Automatic Database Updates ===&lt;br /&gt;
&lt;br /&gt;
Obsidian automatically applies schema updates and data upgrades to its database on startup. In some cases, it may be desirable to disable this once the database has been fully initialized and upgrades to new versions are not going to be deployed. For example, you may wish to run Obsidian with a user who does not have privileges to modify the database schema.&lt;br /&gt;
&lt;br /&gt;
To do so, you can either set a Java system property, or if you are using the admin web application WAR, you can add a setting to your &amp;lt;code&amp;gt;WEB-INF/web.xml&amp;lt;/code&amp;gt; within the archive.&lt;br /&gt;
&lt;br /&gt;
As a system property:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-DstartupRunnerClass=com.carfey.ops.run.NullRunner&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In &amp;lt;code&amp;gt;WEB-INF/web.xml&amp;lt;/code&amp;gt;, after any &amp;lt;code&amp;gt;listener&amp;lt;/code&amp;gt; elements:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;context-param&amp;gt;&lt;br /&gt;
    &amp;lt;param-name&amp;gt;startupRunnerClass&amp;lt;/param-name&amp;gt;&lt;br /&gt;
    &amp;lt;param-value&amp;gt;com.carfey.ops.run.NullRunner&amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Disabling DDL Updates ===&lt;br /&gt;
&lt;br /&gt;
It may also be helpful to apply schema updates (DDL) outside Obsidian through a privileged account, but allow Obsidian upgrades to make the necessary data initialization/modifications. This can be done using a &#039;&#039;&#039;skipDDL&#039;&#039;&#039; configuration property documented under [[Advanced_Configuration#Miscellaneous_Properties | Advanced Configuration]].&lt;br /&gt;
&lt;br /&gt;
=== Disabling Job Scheduling in the Web Application ===&lt;br /&gt;
&lt;br /&gt;
If you have combined scheduler and admin web application WAR already built, you can easily tweak it to disable the scheduler process. &lt;br /&gt;
&lt;br /&gt;
Simply add the following to your &amp;lt;code&amp;gt;WEB-INF/web.xml&amp;lt;/code&amp;gt; within the WAR archive after any &amp;lt;code&amp;gt;listener&amp;lt;/code&amp;gt; elements:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;context-param&amp;gt;&lt;br /&gt;
    &amp;lt;param-name&amp;gt;schedulerEnabled&amp;lt;/param-name&amp;gt;&lt;br /&gt;
    &amp;lt;param-value&amp;gt;false&amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= You’re Good to Go! =&lt;br /&gt;
&lt;br /&gt;
You&#039;re now ready to log into the web application and start scheduling jobs! The URL you use to access Obsidian will depend on how it&#039;s been deployed, but will typically be something like http://localhost/obsidian, or http://localhost/standadminObsidianAdmin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Default User:&#039;&#039;&#039; Each Obsidian installation using native authentication starts with a single default user named &#039;&#039;admin&#039;&#039; with password &#039;&#039;changeme&#039;&#039;. You should change this after your first log in. See [[Admin_User_Management|User Management]] for how to change a user&#039;s password.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
At this point we suggest you play around with the admin web application. Many screens offer inline help. Otherwise, you can refer to our [[Admin Web Application Guide]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To get started writing jobs that you can run in Obsidian, see [[Implementing_Jobs|Implementing Jobs]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
See the &#039;&#039;&#039;[[User Guide]]&#039;&#039;&#039; if you have questions or wish to explore what Obsidian offers.&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Getting_Started&amp;diff=4090</id>
		<title>Getting Started</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Getting_Started&amp;diff=4090"/>
		<updated>2026-07-09T20:38:07Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This Getting Started is for Obsidian 4.0 and newer versions. See the [[Getting_Started_(3.x.x_and_earlier)|Previous Getting Started]] for prior versions.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This guide will help you choose a deployment setup that works for you, and then get it running. Before reading this page, you may wish to review Obsidian&#039;s [[Deployment Models]] to understand the different parts of Obsidian or to find out what deployment model works for you.&lt;br /&gt;
&lt;br /&gt;
If you&#039;ve are looking to start writing your own Obsidian jobs, see [[Implementing Jobs]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Supported Platforms =&lt;br /&gt;
&lt;br /&gt;
Please quickly review our supported platforms before continuing.&lt;br /&gt;
&lt;br /&gt;
* Obsidian is OS-independent, and runs on the Java Virtual Machine. It works in a variety of environments, including Linux, OSX and Windows, and can be run inside virtual machines.&lt;br /&gt;
* Obsidian 5.x.x and 6.x.x run on Java 11 or above (Obsidian 4.x.x runs on Java 1.7 or above)&lt;br /&gt;
* Obsidian&#039;s administration web application is a servlet application.&lt;br /&gt;
** 7.x.x has been tested on Tomcat 10.x&lt;br /&gt;
** 6.x.x has been tested on Tomcat 10.x and Jetty 11.x (Jakarta Servlet 5.0)&lt;br /&gt;
** 5.x.x has been tested on Tomcat 9.x and Jetty 10.x (Javax Servlet 4.0)&lt;br /&gt;
** 4.x.x has been tested on Tomcat 7, 8 &amp;amp; 8.5 and Jetty 9.x (Javax Servlet 4.0)&lt;br /&gt;
* It works on all modern browsers and is tested on recent versions of Chrome, Edge and Firefox.&lt;br /&gt;
* Obsidian requires one of the following fully-supported database platforms:&lt;br /&gt;
** MySQL 8.0.x (Obsidian 5.x and higher), 5.5-5.7 (excluding Galera)&lt;br /&gt;
** MariaDB 5.5&lt;br /&gt;
** Oracle 18c, 19c, 21c on Obsidian 5.x and higher&lt;br /&gt;
** Oracle 10g, 11.x, 12c on versions prior to Obsidian 5.0.0&lt;br /&gt;
** PostgreSQL 11-16 on Obsidian 5.x and higher&lt;br /&gt;
** PostgreSQL 9, 10&lt;br /&gt;
** MS SQL Server 2008-2019&lt;br /&gt;
** H2 1.4. &lt;br /&gt;
** &#039;&#039;Larger major versions are likely to work without issues but are not officially supported.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; With some exceptions, clustered scheduler instances require access to contact license servers over the Internet, or access to an internal proxy license server. See [[Licenses &amp;amp; Nodes]] for more information.&lt;br /&gt;
&lt;br /&gt;
== Hardware Requirements ==&lt;br /&gt;
&lt;br /&gt;
We recommend the following minimum hardware for typical installations:&lt;br /&gt;
&lt;br /&gt;
* 1 GHz processor&lt;br /&gt;
* 2 GB RAM&lt;br /&gt;
* 1 GB hard disk space (excluding accumulated logs)&lt;br /&gt;
&lt;br /&gt;
Note that actual requirements may vary depending on job volume, clustering and other factors.&lt;br /&gt;
&lt;br /&gt;
= Choose Your Installation Type =&lt;br /&gt;
&lt;br /&gt;
Obsidian consists of two main processes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scheduler&#039;&#039;&#039; - schedules and executes jobs, sends notifications, etc. Also exposes the [[Embedded API]].&lt;br /&gt;
* &#039;&#039;&#039;Admin Web Application&#039;&#039;&#039; - provides management and monitoring UI, plus the [[REST API]] and [[Embedded API]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These can be run together or separately in the following configurations. You will pick one or more of these options together to provide both the scheduler and admin web application functionality.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Standalone Scheduler&#039;&#039;&#039; - A Java process that performs job execution. A standalone scheduler installation is generated when you run the Obsidian installer, and may be customized by adding JAR files containing your job code. It is started and stopped by scripts included with the installation. Requires a separate admin web application to be deployed.&lt;br /&gt;
# &#039;&#039;&#039;Embedded Scheduler&#039;&#039;&#039; - Provides job execution like a standalone scheduler, but instead runs as a process embedded within and started from your application. This eliminates the need to customize and deploy a separate artifact which will perform job execution. Requires a separate admin web application to be deployed.&lt;br /&gt;
# &#039;&#039;&#039;Standalone Admin Web Application&#039;&#039;&#039; - A Java servlet application providing Obsidian&#039;s administration capabilities but no scheduling services.  A standalone admin application WAR file is generated when you run the Obsidian installer, and may be customized by adding JAR files containing your job code.  Requires a separate standalone, embedded or combined scheduler and web application to be deployed for job execution to be performed.&lt;br /&gt;
# &#039;&#039;&#039;Combined Scheduler and Admin Web Application&#039;&#039;&#039; - A version of the admin web application which also runs a scheduler service for job execution. A combined scheduler and admin application WAR file is generated when you run the Obsidian installer, and may be customized by adding JAR files containing your job code. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Regardless of the deployment configuration, any time you run more than one scheduler process operating against the same Obsidian database, they will automatically form a cluster and share in job execution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Choosing which installation type works best for you depends on your specific needs. The setups which are suitable for most cases are, in order: &lt;br /&gt;
&lt;br /&gt;
* Using an &#039;&#039;&#039;Embedded Scheduler&#039;&#039;&#039; (option 2), along with a &#039;&#039;&#039;Standalone Admin Web Application&#039;&#039;&#039; (option 3). This approach lets you embed Obsidian into your existing application without having to alter the Obsidian artifacts to include your job code. Instead, Obsidian&#039;s required libraries are included in your application and they are deployed together.&lt;br /&gt;
* Using a  &#039;&#039;&#039;Combined Scheduler and Admin Web Application&#039;&#039;&#039; (option 4) alone or in a cluster. This is suitable if you don&#039;t have another application containing job code for Obsidian to execute, or if you simply want to use Obsidian&#039;s scripting support, which doesn&#039;t require deploying JAR files.&lt;br /&gt;
&lt;br /&gt;
= Downloading Obsidian =&lt;br /&gt;
Just go to our [https://web.obsidianscheduler.com/download/ download page], and grab the latest Obsidian&#039;s installation zip file. There is no need to register or obtain a license before downloading.&lt;br /&gt;
&lt;br /&gt;
Once you&#039;ve downloaded the zip file, extract it to a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
If you are trying to upgrade to a newer version of Obsidian, see [[Upgrading_Obsidian|upgrade]] instructions.&lt;br /&gt;
&lt;br /&gt;
= Quick Start for Evaluation Purposes =&lt;br /&gt;
&lt;br /&gt;
If you wish to quickly try Obsidian without minimal setup required, follow these steps. Otherwise, skip ahead to [[#Initial Setup|Initial Setup]].&lt;br /&gt;
&lt;br /&gt;
== Really Quick Method Using Embedded Database ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;We do not recommend this setup for production use. &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Ensure you have a JDK (11 or up for Obsidian 6.x.x &amp;amp; 5.x.x, 1.7 or up for Obsidian 4.x.x) installed and that the &amp;lt;code&amp;gt;JAVA_HOME&amp;lt;/code&amp;gt; environment variable is set to your JDK installation directory.&lt;br /&gt;
# Unzip the Obsidian download zip file to a directory of your choice.&lt;br /&gt;
# At the command line, in the zip extraction directory, run the [[Installation_Guide|installer]] using this command, substituting the appropriate Obsidian version number: &amp;lt;code&amp;gt;java -jar Obsidian-Install-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;.jar h2-tomcat-quick-start.xml&amp;lt;/code&amp;gt;&lt;br /&gt;
# Start Obsidian using the command: &amp;lt;code&amp;gt;./webObsidian.sh start scheduler&amp;lt;/code&amp;gt; for Linux or &amp;lt;code&amp;gt;webObsidian.bat start scheduler&amp;lt;/code&amp;gt; for Windows.&lt;br /&gt;
# Go to http://localhost:8080 in your browser and check out your fully functional Obsidian web application and scheduler! You can log in to the admin web application with the default user &#039;&#039;admin&#039;&#039; and password &#039;&#039;changeme&#039;&#039;.&lt;br /&gt;
# When you&#039;re done, stop Obsidian using the command: &amp;lt;code&amp;gt;./webObsidian.sh stop&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;webObsidian.bat stop&amp;lt;/code&amp;gt; for Windows.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; If you restart the Quick Start installation and see &amp;quot;lock wait timeout&amp;quot; or similar errors in the log screen, you may have to delete your embedded H2 database lock file. By default, the file name is &#039;&#039;obsidian.lock.db&#039;&#039; and is located in the user home directory.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; If you see a &amp;lt;code&amp;gt;java.net.BindException: Permission denied&amp;lt;/code&amp;gt; error on startup, you will need to use an alternate port. See [[Troubleshooting]] for details on how to change this.&lt;br /&gt;
&lt;br /&gt;
== Quick Method Using Existing Database ==&lt;br /&gt;
&lt;br /&gt;
If you wish to get Obsidian running quickly using a database platform you already have running, follow these steps:&lt;br /&gt;
&lt;br /&gt;
# Ensure you have a JDK (11 or up for Obsidian 6.x.x and 5.x.x, 1.7 or up for Obsidian 4.x.x) installed and that the &amp;lt;code&amp;gt;JAVA_HOME&amp;lt;/code&amp;gt; environment variable is set to your JDK installation directory.&lt;br /&gt;
# Unzip the Obsidian download zip file to a directory of your choice.&lt;br /&gt;
# At the command line, in the zip extraction directory, run the [[Installation_Guide|installer]] using this command, substituting the appropriate Obsidian version number: &amp;lt;code&amp;gt;java -jar Obsidian-Install-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;.jar&amp;lt;/code&amp;gt;&lt;br /&gt;
# Start Obsidian using the command: &amp;lt;code&amp;gt;./webObsidian.sh start scheduler&amp;lt;/code&amp;gt; for Linux or &amp;lt;code&amp;gt;webObsidian.bat start scheduler&amp;lt;/code&amp;gt; for Windows.&lt;br /&gt;
# Go to http://localhost:8080 in your browser and check out your fully functional Obsidian web application and scheduler! You can log in to the admin web application with the default user &#039;&#039;admin&#039;&#039; and password &#039;&#039;changeme&#039;&#039;.&lt;br /&gt;
# When you&#039;re done, stop Obsidian using the command: &amp;lt;code&amp;gt;./webObsidian.sh stop&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;webObsidian.bat stop&amp;lt;/code&amp;gt; for Windows.&lt;br /&gt;
&lt;br /&gt;
= Initial Setup  =&lt;br /&gt;
&lt;br /&gt;
This section covers the setup required after you&#039;ve selected your [[#Choose_Your_Installation_Type|installation type]]. &lt;br /&gt;
&lt;br /&gt;
== Database ==&lt;br /&gt;
&lt;br /&gt;
Obsidian requires a database which must be created before running Obsidian. Multiple [[#Supported Platforms|database platforms]] are supported. Obsidian can share a database/schema with another application.&lt;br /&gt;
&lt;br /&gt;
Note that the database must exist before deployment, but by default Obsidian will automatically create all required tables.&lt;br /&gt;
&lt;br /&gt;
Later, you will specify database connection parameters within Obsidian&#039;s installer to tell it how to connect. If you need to configure advanced settings or change settings directly after you&#039;ve run run the installer, see [[Advanced Configuration]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Obsidian needs to create the tables in the target database. If the schema is shared with your application’s tables, please ensure there are no name conflicts. If there are conflicts, separate schemas/databases can be used, or a table prefix can be specified as shown in [[Advanced_Configuration#Database_Properties|Advanced Configuration]]. [[Obsidian Tables]] lists the tables Obsidian will created upon first deployment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Manual Schema Creation ===&lt;br /&gt;
&lt;br /&gt;
When you start Obsidian, it will automatically detect and create missing tables in your target database. However, if you wish to run Obsidian with a database user that does not have create privileges, or simply wish to prepare your database structure ahead of time, you can use the database scripts provided with your download zip file under the &amp;quot;db_scripts&amp;quot; directory.&lt;br /&gt;
&lt;br /&gt;
First create your database, and locate the &amp;quot;complete.sql&amp;quot; file under the directory for the database you are using under the &amp;quot;db_scripts&amp;quot; directory. Statements within this file contain the token &amp;quot;$px$&amp;quot; to enable table prefixes. Before you run the SQL file, replace all instances of the token &amp;quot;$px$&amp;quot; (without quotes) with a table prefix 6 characters or shorter (letters and underscores supported), or with blank.&lt;br /&gt;
&lt;br /&gt;
Then, in your SQL client of choice, execute the script and all the required Obsidian tables will be created.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Alternate Oracle Schemas ===&lt;br /&gt;
&lt;br /&gt;
After allowing Obsidian to create all the required tables and initial data by deploying it a single time, Obsidian can be run with an alternate Oracle user by specifying the target schema on Oracle databases. See [[Advanced_Configuration#Database_Properties|Advanced Configuration]] for the property to set.&lt;br /&gt;
&lt;br /&gt;
If you use a separate user from the schema owner, you must grant the user [[Obsidian_Tables#Oracle Privileges|certain privileges]] for Obsidian to function correctly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MS SQL Server Snapshot Isolation ===&lt;br /&gt;
&lt;br /&gt;
For maximum compatibility and to avoid deadlocks, MS SQL Server should be configured to use [https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/sql/snapshot-isolation-in-sql-server read committed snapshot isolation].&lt;br /&gt;
&lt;br /&gt;
This can be enabled on your database by running the following commands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER DATABASE MyDatabase SET ALLOW_SNAPSHOT_ISOLATION ON&lt;br /&gt;
ALTER DATABASE MyDatabase SET READ_COMMITTED_SNAPSHOT ON&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
&lt;br /&gt;
By default, Obsidian manages its own set users and logins to restrict access to the admin web application and REST API. A default “admin” user is created when the scheduler is first deployed and no additional setup is required.&lt;br /&gt;
&lt;br /&gt;
Alternatively, to use LDAP authentication, select the LDAP option in the installer and enter your LDAP details.&lt;br /&gt;
&lt;br /&gt;
As of 7.0.0, you can also select OAuth / OIDC authentication to enable Single Sign-On via an external identity provider. See [[Authenticator#OAuthAuthenticator_(OIDC_SSO)|OAuthAuthenticator]] for details.&lt;br /&gt;
&lt;br /&gt;
Finally, you may implement your own [[authenticator|custom authenticator]] Java class, which you also enter when running the installer.&lt;br /&gt;
&lt;br /&gt;
= Running the Installer =&lt;br /&gt;
&lt;br /&gt;
Now that you&#039;ve chosen your installation type and performed initial setup of your database and authentication, you can run Obsidian&#039;s installer to configure and build a set of artifacts that you can either use to embed Obsidian, or deploy directly.&lt;br /&gt;
&lt;br /&gt;
To run the installer, please follow our detailed [[Installation_Guide|installation guide]].&lt;br /&gt;
&lt;br /&gt;
=== Installer-Created Artifacts ===&lt;br /&gt;
&lt;br /&gt;
Once you&#039;ve run the installer, your installation directory will look something like the following, depending on which artifacts you chose to generate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
├───db_scripts&lt;br /&gt;
└───Obsidian-7.0.0&lt;br /&gt;
    │   com.carfey.yaml.reference&lt;br /&gt;
    │   obsidian.war&lt;br /&gt;
    │   obsidian-builtin-job-src.jar&lt;br /&gt;
    │   obsidianForkedJob.bat&lt;br /&gt;
    │   obsidianForkedJob.sh&lt;br /&gt;
    │   obsidian-javadoc.zip&lt;br /&gt;
    │   standaloneObsidian.bat&lt;br /&gt;
    │   standaloneObsidian.sh&lt;br /&gt;
    │   standaloneObsidianAdmin.war&lt;br /&gt;
    │   webObsidian.bat&lt;br /&gt;
    │   webObsidian.sh&lt;br /&gt;
    │&lt;br /&gt;
    ├───embed-tomcat-lib  (present when an Embedded Tomcat pack is selected)&lt;br /&gt;
    ├───license&lt;br /&gt;
    ├───logs&lt;br /&gt;
    └───standalone&lt;br /&gt;
        (various JAR files...)&lt;br /&gt;
        obsidian-yaml-configuration.jar&lt;br /&gt;
        obsidian.jar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The installer creates a top-level directory named &#039;&#039;&#039;Obsidian-n.n.n&#039;&#039;&#039; containing generated artifacts. The key files and directories are:&lt;br /&gt;
&lt;br /&gt;
; com.carfey.yaml.reference or com.carfey.properties.reference&lt;br /&gt;
: Copy of the configuration file generated by the installer.&lt;br /&gt;
; obsidian.war&lt;br /&gt;
: Combined scheduler and admin web application WAR. Deploy directly to a servlet container, or run locally using the Embedded Tomcat pack (see below). Customise by adding your job code and dependencies as JARs to &#039;&#039;&#039;/WEB-INF/lib&#039;&#039;&#039; within the archive.&lt;br /&gt;
; standaloneObsidian.bat and standaloneObsidian.sh&lt;br /&gt;
: Windows and Linux scripts to start the standalone scheduler process with no web application. Customise by adding your job code and dependencies as JARs to the &#039;&#039;&#039;standalone&#039;&#039;&#039; directory.&lt;br /&gt;
; webObsidian.bat and webObsidian.sh&lt;br /&gt;
: Windows and Linux scripts to start Obsidian using the embedded Tomcat runtime (requires the &#039;&#039;&#039;Obsidian Embedded Tomcat JAR&#039;&#039;&#039; or &#039;&#039;&#039;Obsidian Standalone Admin Embedded Tomcat JAR&#039;&#039;&#039; pack). Use &#039;&#039;&#039;start scheduler&#039;&#039;&#039; to run the combined scheduler+admin WAR, or &#039;&#039;&#039;start adminOnly&#039;&#039;&#039; to run the standalone admin WAR. Stop with &#039;&#039;&#039;stop&#039;&#039;&#039;.&lt;br /&gt;
; standaloneObsidianAdmin.war&lt;br /&gt;
: Standalone admin web application WAR (no scheduler). Deploy directly to a servlet container or run via the embedded Tomcat pack.&lt;br /&gt;
; embed-tomcat-lib&lt;br /&gt;
: Present when an Embedded Tomcat pack is selected. Contains the embedded Tomcat runtime JARs used by the &#039;&#039;&#039;webObsidian&#039;&#039;&#039; scripts.&lt;br /&gt;
; standalone&lt;br /&gt;
: Directory containing JARs required to run the standalone scheduler process. &#039;&#039;&#039;obsidian-yaml-configuration.jar&#039;&#039;&#039; or &#039;&#039;&#039;obsidian-properties-configuration.jar&#039;&#039;&#039; contains the Obsidian configuration file. To make configuration changes for the standalone scheduler, update the configuration file within this JAR.&lt;br /&gt;
&lt;br /&gt;
== Starting Obsidian with embedded Tomcat ==&lt;br /&gt;
&lt;br /&gt;
If you selected the &#039;&#039;&#039;Obsidian Embedded Tomcat JAR&#039;&#039;&#039; or &#039;&#039;&#039;Obsidian Standalone Admin Embedded Tomcat JAR&#039;&#039;&#039; pack during installation, use the &#039;&#039;&#039;webObsidian&#039;&#039;&#039; scripts to start and stop Obsidian.&lt;br /&gt;
&lt;br /&gt;
From the Obsidian install directory:&lt;br /&gt;
&lt;br /&gt;
 webObsidian.bat start scheduler&lt;br /&gt;
 (Unix: ./webObsidian.sh start scheduler)&lt;br /&gt;
&lt;br /&gt;
For standalone admin only:&lt;br /&gt;
&lt;br /&gt;
 webObsidian.bat start adminOnly&lt;br /&gt;
&lt;br /&gt;
Stop:&lt;br /&gt;
&lt;br /&gt;
 webObsidian.bat stop&lt;br /&gt;
 (Unix: ./webObsidian.sh stop)&lt;br /&gt;
&lt;br /&gt;
Default HTTP port is &#039;&#039;&#039;8080&#039;&#039;&#039;. To change ports, pass &#039;&#039;&#039;-Dembedded.tomcat.http.port&#039;&#039;&#039;, &#039;&#039;&#039;-Dembedded.tomcat.stop.port&#039;&#039;&#039;, and &#039;&#039;&#039;-Dembedded.tomcat.stop.key&#039;&#039;&#039; as JVM arguments before starting.&lt;br /&gt;
&lt;br /&gt;
If you are deploying &#039;&#039;&#039;obsidian.war&#039;&#039;&#039; to your own external servlet container instead, refer to your container&#039;s deployment documentation.&lt;br /&gt;
&lt;br /&gt;
= Embedding Obsidian &amp;amp; Customizing Artifacts =&lt;br /&gt;
&lt;br /&gt;
The Obsidian scheduler process needs Java classpath access to your jobs so it can detect valid jobs and execute them. This requires a bit of customization before you are ready to run custom Java jobs. If you still haven&#039;t created your custom jobs, consult [[Implementing Jobs]] before proceeding. If you only intend to use [[Scripting Jobs]], customization will not be required and you can skip to [[#Deployment|Deployment]].&lt;br /&gt;
&lt;br /&gt;
If you want to embed Obsidian into your application or need to deploy jobs and their dependent libraries to the generated Obsidian artifacts, follow the steps in the appropriate sections below.&lt;br /&gt;
&lt;br /&gt;
Note that only Obsidian scheduler processes need to be customized to include your job code. The admin web application itself does not require classpath access to your jobs.&lt;br /&gt;
&lt;br /&gt;
== Embedding Obsidian - Importing Libraries and Properties File ==&lt;br /&gt;
&lt;br /&gt;
To embed Obsidian, you will need to update your application build to bring in the JAR files it requires, along with the Obsidian properties file. Simply follow these steps:&lt;br /&gt;
&lt;br /&gt;
# Import all required [[Advanced_Configuration#Dependent_Libraries|Obsidian JAR files]] into your project and reference them in your build files. &lt;br /&gt;
#* These can be obtained from the &amp;lt;code&amp;gt;standalone&amp;lt;/code&amp;gt; directory of your installation. Make sure you &#039;&#039;&#039;exclude&#039;&#039;&#039; &amp;lt;code&amp;gt;obsidian-(yaml/properties)-configuration.jar&amp;lt;/code&amp;gt;&lt;br /&gt;
#* Ensure your Maven, Gradle or Ant files are updated to include all required libraries in your build, along with your IDE.&lt;br /&gt;
# Make a copy of &amp;lt;code&amp;gt;com.carfey.yaml.reference&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;com.carfey.properties.reference&amp;lt;/code&amp;gt; from your installation with the &amp;lt;code&amp;gt;.reference&amp;lt;/code&amp;gt; suffix removed, and add it to your project&#039;s classpath.&lt;br /&gt;
#* This is typically just a matter of adding it to your project&#039;s resources directory.&lt;br /&gt;
#* From now on, you can update this file to change the various configuration options such as database connection details.&lt;br /&gt;
#* You may wish to leave this file out of source control and let developers configure their own installations. However, any running Obsidian instance will need access to a valid [[Advanced_Configuration#Properties.2FYaml_File|properties file]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Maven users:&#039;&#039;&#039; Note that we do not publish Maven artifacts for Obsidian, so you will not be able to include them by referencing a public repository.&lt;br /&gt;
&lt;br /&gt;
== Adding Custom Jobs to Standalone Scheduler ==&lt;br /&gt;
&lt;br /&gt;
In order for the standalone scheduler to detect and execute custom jobs written in Java, you will need to ensure Obsidian&#039;s classpath contains the compiled job code, along with its dependencies.&lt;br /&gt;
&lt;br /&gt;
To do so, you need to perform just one step before starting the standalone scheduler:&lt;br /&gt;
&lt;br /&gt;
# Copy JAR files containing custom Obsidian jobs and all runtime dependencies to the &amp;lt;code&amp;gt;standalone&amp;lt;/code&amp;gt; directory in your installation.&lt;br /&gt;
#* These JARs should be alongside &amp;lt;code&amp;gt;obsidian.jar&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* All JAR files in this directory will be automatically added to the classpath when run via the &amp;lt;code&amp;gt;standaloneObsidian.sh&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;standaloneObsidian.bat&amp;lt;/code&amp;gt; scripts.&lt;br /&gt;
&lt;br /&gt;
== Adding Custom Jobs to Combined Scheduler and Admin Web Application ==&lt;br /&gt;
&lt;br /&gt;
In order for the combined scheduler and admin web application to detect and execute custom jobs written in Java, you will need to ensure Obsidian&#039;s classpath contains the compiled job code, along with its dependencies.&lt;br /&gt;
&lt;br /&gt;
To do so, you need to perform just one step before deploying the Obsidian WAR file:&lt;br /&gt;
&lt;br /&gt;
# Copy JAR files containing custom Obsidian jobs and all runtime dependencies to the &amp;lt;code&amp;gt;WEB-INF/lib&amp;lt;/code&amp;gt; directory within the WAR archive.&lt;br /&gt;
#* These JARs should be alongside &amp;lt;code&amp;gt;obsidian.jar&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* WAR files use the ZIP format and can be extracted and recompressed with normal ZIP tools or the JDK &amp;lt;code&amp;gt;jar&amp;lt;/code&amp;gt; utility.&lt;br /&gt;
&lt;br /&gt;
== Updating the Properties File in Admin Web Applications ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Note that updating the WAR artifact is not necessary to perform properties file changes when using an external properties file as described [[Advanced_Configuration#Properties_File|here]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you need to change [[Advanced_Configuration#Properties_File|configuration properties]] for a standalone admin web application or combined scheduler and admin web application, follow these steps:&lt;br /&gt;
&lt;br /&gt;
# Obtain the WAR artifact from your installation that requires changes. This is either &amp;lt;code&amp;gt;obsidian.war&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;standaloneObsidianAdmin.war&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Extract the WAR file to a clean directory.&lt;br /&gt;
# Edit the &amp;lt;code&amp;gt;com.carfey.(yaml/properties)&amp;lt;/code&amp;gt; file within the subdirectory &amp;lt;code&amp;gt;WEB-INF/classes&amp;lt;/code&amp;gt; and save your changes.&lt;br /&gt;
# Rebundled the WAR artifact using a zip utility or the JDK &amp;lt;code&amp;gt;jar&amp;lt;/code&amp;gt; utility.&lt;br /&gt;
#* Some zip utilities such as 7Zip will allow you to edit files within an archive directly without the previous steps. It is generally safe to do so.&lt;br /&gt;
&lt;br /&gt;
= Deployment =&lt;br /&gt;
&lt;br /&gt;
You are now ready to deploy your scheduler and/or admin web application.&lt;br /&gt;
&lt;br /&gt;
== Embedded Scheduler ==&lt;br /&gt;
&lt;br /&gt;
When Obsidian is embedded, there is no separate deployment process. However, you will need to start and stop Obsidian with your application. If you are using Spring, we recommend you use our [[Spring Integration]] instead, which will automatically start and stop the scheduler for you.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
During your application startup, once it is fully initialized (or as close as possible), start Obsidian, and save a reference to the returned result so you can shut it down later:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// This will start the scheduler on the first call to get().&lt;br /&gt;
&lt;br /&gt;
com.carfey.ops.job.SchedulerStarter starter = com.carfey.ops.job.SchedulerStarter.get(com.carfey.ops.job.SchedulerStarter.SchedulerMode.EMBEDDED);&lt;br /&gt;
&lt;br /&gt;
// ...&lt;br /&gt;
&lt;br /&gt;
// Later, we need to gracefully shut down the scheduler &lt;br /&gt;
starter.shutDown();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will run Obsidian&#039;s scheduler process, but will not include any of the web application or the REST API. This functionality is provided by the admin web application.&lt;br /&gt;
&lt;br /&gt;
== Standalone Admin Web Application ==&lt;br /&gt;
&lt;br /&gt;
To deploy the standalone admin web application, simply deploy the &amp;lt;code&amp;gt;standaloneObsidianAdmin.war&amp;lt;/code&amp;gt; file your servlet container of choice (e.g. Tomcat) after configuring it appropriately. You may rename the WAR file to have it deployed under a different context path, if desired (e.g. &amp;quot;ROOT.war&amp;quot; or &amp;quot;obsidian.war&amp;quot;). Consult your servlet documentation to find out how to deploy the application and start the servlet container.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; If you want to use the included Jetty server as your servlet container, you can use the scripts included in your installation instead of deploying the WAR. This will make the application accessible at http://localhost:8080.&lt;br /&gt;
* To start &lt;br /&gt;
** Linux: &amp;lt;code&amp;gt;./webObsidian.sh start adminOnly&amp;lt;/code&amp;gt;&lt;br /&gt;
** Windows: &amp;lt;code&amp;gt;webObsidian.bat start adminOnly&amp;lt;/code&amp;gt;&lt;br /&gt;
* To stop&lt;br /&gt;
** Linux: &amp;lt;code&amp;gt;./webObsidian.sh stop&amp;lt;/code&amp;gt; &lt;br /&gt;
** Windows: &amp;lt;code&amp;gt;webObsidian.bat stop&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Security Note:&#039;&#039;&#039; By default, the admin web application allows non-secure connections. If you wish to force secure connections through HTTPS, you can edit the web.xml in your war and uncomment the &amp;lt;security-constraint&amp;gt; element in the file. This will force all requests to redirect to an encrypted connection. For details on setting up SSL on your servlet container, refer to its documentation.&lt;br /&gt;
&lt;br /&gt;
== Standalone Scheduler ==&lt;br /&gt;
&lt;br /&gt;
To deploy and run the standalone scheduler, you may use the provided scripts in your installation directory:&lt;br /&gt;
* Linux: &amp;lt;code&amp;gt;./standaloneObsidian.sh start&amp;lt;/code&amp;gt;&lt;br /&gt;
* Windows: &amp;lt;code&amp;gt;standaloneObsidian.bat start&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You should always stop Obsidian gracefully when possible by using:&lt;br /&gt;
* Linux: &amp;lt;code&amp;gt;./standaloneObsidian.sh stop&amp;lt;/code&amp;gt;&lt;br /&gt;
* Windows: &amp;lt;code&amp;gt;standaloneObsidian.bat stop&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Both the start and stop commands may be supplied an additional argument to override the &amp;lt;code&amp;gt;listenerPort&amp;lt;/code&amp;gt; which defaults to 10451.&lt;br /&gt;
&lt;br /&gt;
Rather than use one of the provided scripts, you can invoke the equivalent Java command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java com.carfey.ops.job.SchedulerStarter start &amp;lt;listenerPort&amp;gt;&lt;br /&gt;
java com.carfey.ops.job.SchedulerStarter stop &amp;lt;listenerPort&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Combined Scheduler and Admin Web Application ==&lt;br /&gt;
&lt;br /&gt;
To deploy the combined scheduler and admin web application, simply deploy the &amp;lt;code&amp;gt;obsidian.war&amp;lt;/code&amp;gt; file your servlet container of choice (e.g. Tomcat) after configuring it appropriately. You may rename the WAR file to have it deployed under a different context path, if desired (e.g. &amp;quot;ROOT.war&amp;quot;). Consult your servlet documentation to find out how to deploy the application and start the servlet container.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; If you want to use the included Jetty server as your servlet container, you can use the scripts included in your installation instead of deploying the WAR.  This will make the web application accessible at the URL http://localhost:8080.&lt;br /&gt;
&lt;br /&gt;
* To start &lt;br /&gt;
** Linux: &amp;lt;code&amp;gt;./webObsidian.sh start scheduler&amp;lt;/code&amp;gt;&lt;br /&gt;
** Windows: &amp;lt;code&amp;gt;webObsidian.bat start scheduler&amp;lt;/code&amp;gt;&lt;br /&gt;
* To stop&lt;br /&gt;
** Linux: &amp;lt;code&amp;gt;./webObsidian.sh stop&amp;lt;/code&amp;gt; &lt;br /&gt;
** Windows: &amp;lt;code&amp;gt;webObsidian.bat stop&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Security Note:&#039;&#039;&#039; By default, the admin web application allows non-secure connections. If you wish to force secure connections through HTTPS, you can edit the web.xml in your war and uncomment the &amp;lt;security-constraint&amp;gt; element in the file. This will force all requests to redirect to an encrypted connection. For details on setting up SSL on your servlet container, refer to its documentation.&lt;br /&gt;
&lt;br /&gt;
== Embedding the Obsidian Web Application in Another Web Application ==&lt;br /&gt;
&lt;br /&gt;
We do not generally recommend attempting to merge the Obsidian admin web application with another servlet web application, but it can be done by following these steps:&lt;br /&gt;
&lt;br /&gt;
To embed the full Obsidian web application in an existing web application, you will need to extract the necessary sections from the &amp;lt;code&amp;gt;WEB-INF/web.xml&amp;lt;/code&amp;gt; file in the &amp;lt;code&amp;gt;obsidian.war&amp;lt;/code&amp;gt; file and merge them into your application&#039;s &amp;lt;code&amp;gt;web.xml&amp;lt;/code&amp;gt; file. This includes all &amp;quot;listener&amp;quot;, &amp;quot;servlet&amp;quot;, &amp;quot;servlet-mapping&amp;quot;, &amp;quot;jsp-config&amp;quot;, &amp;quot;filter&amp;quot;, &amp;quot;filter-mapping&amp;quot; elements, and optionally &amp;quot;welcome-file-list&amp;quot; and &amp;quot;error-page&amp;quot; elements. Ensure that all servlet paths are maintained. If you are using a different servlet specification version, you may need to update the mappings to the appropriate format.&lt;br /&gt;
&lt;br /&gt;
Note the use of our &amp;lt;code&amp;gt;com.carfey.ops.servlet.StartupShutdownListener&amp;lt;/code&amp;gt; which takes care of starting up the scheduler instance and using the web container&#039;s default shutdown mechanism to ensure graceful shutdown. This listener will start Obsidian&#039;s scheduler process and initialize the Obsidian web application. &lt;br /&gt;
&lt;br /&gt;
If you wish to embed Obsidian&#039;s web application without the scheduler running, include the following parameter element in your &amp;lt;code&amp;gt;web.xml&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;context-param&amp;gt;&lt;br /&gt;
   &amp;lt;param-name&amp;gt;schedulerEnabled&amp;lt;/param-name&amp;gt;&lt;br /&gt;
   &amp;lt;param-value&amp;gt;false&amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Additional Deployment Details ==&lt;br /&gt;
&lt;br /&gt;
=== Classpath Notes ===&lt;br /&gt;
&lt;br /&gt;
To run a scheduler with your custom code and jobs, you need to ensure the scheduler process classpath includes your code packaged into JAR files, as described [[#Embedding_Obsidian_.26_Customizing_Artifacts|above]]. &lt;br /&gt;
&lt;br /&gt;
If a compiled job is updated, you will have to restart your application or the servlet container after deploying updated jars, unless you are using [[Job Forking]].&lt;br /&gt;
&lt;br /&gt;
=== Setting Host Names ===&lt;br /&gt;
Obsidian instances will automatically assign themselves host names if no host name is explicitly set, but you may wish to give them explicit names to make scheduling and monitoring simpler.&lt;br /&gt;
&lt;br /&gt;
If you wish to assign explicit names, simply set the Java system property &amp;lt;code&amp;gt;schedulerDesignation&amp;lt;/code&amp;gt; to the host name of your choice. For example, if starting an instance using the standalone scheduler using &amp;lt;code&amp;gt;java&amp;lt;/code&amp;gt; directly, simply add the value &amp;lt;code&amp;gt;-DschedulerDesignation=myHostName&amp;lt;/code&amp;gt; to the end of the command.&lt;br /&gt;
&lt;br /&gt;
You may also use a properties file setting for the host name as detailed in [[Advanced Configuration]].&lt;br /&gt;
&lt;br /&gt;
=== Disabling Automatic Database Updates ===&lt;br /&gt;
&lt;br /&gt;
Obsidian automatically applies schema updates and data upgrades to its database on startup. In some cases, it may be desirable to disable this once the database has been fully initialized and upgrades to new versions are not going to be deployed. For example, you may wish to run Obsidian with a user who does not have privileges to modify the database schema.&lt;br /&gt;
&lt;br /&gt;
To do so, you can either set a Java system property, or if you are using the admin web application WAR, you can add a setting to your &amp;lt;code&amp;gt;WEB-INF/web.xml&amp;lt;/code&amp;gt; within the archive.&lt;br /&gt;
&lt;br /&gt;
As a system property:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-DstartupRunnerClass=com.carfey.ops.run.NullRunner&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In &amp;lt;code&amp;gt;WEB-INF/web.xml&amp;lt;/code&amp;gt;, after any &amp;lt;code&amp;gt;listener&amp;lt;/code&amp;gt; elements:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;context-param&amp;gt;&lt;br /&gt;
    &amp;lt;param-name&amp;gt;startupRunnerClass&amp;lt;/param-name&amp;gt;&lt;br /&gt;
    &amp;lt;param-value&amp;gt;com.carfey.ops.run.NullRunner&amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Disabling DDL Updates ===&lt;br /&gt;
&lt;br /&gt;
It may also be helpful to apply schema updates (DDL) outside Obsidian through a privileged account, but allow Obsidian upgrades to make the necessary data initialization/modifications. This can be done using a &#039;&#039;&#039;skipDDL&#039;&#039;&#039; configuration property documented under [[Advanced_Configuration#Miscellaneous_Properties | Advanced Configuration]].&lt;br /&gt;
&lt;br /&gt;
=== Disabling Job Scheduling in the Web Application ===&lt;br /&gt;
&lt;br /&gt;
If you have combined scheduler and admin web application WAR already built, you can easily tweak it to disable the scheduler process. &lt;br /&gt;
&lt;br /&gt;
Simply add the following to your &amp;lt;code&amp;gt;WEB-INF/web.xml&amp;lt;/code&amp;gt; within the WAR archive after any &amp;lt;code&amp;gt;listener&amp;lt;/code&amp;gt; elements:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;context-param&amp;gt;&lt;br /&gt;
    &amp;lt;param-name&amp;gt;schedulerEnabled&amp;lt;/param-name&amp;gt;&lt;br /&gt;
    &amp;lt;param-value&amp;gt;false&amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= You’re Good to Go! =&lt;br /&gt;
&lt;br /&gt;
You&#039;re now ready to log into the web application and start scheduling jobs! The URL you use to access Obsidian will depend on how it&#039;s been deployed, but will typically be something like http://localhost/obsidian, or http://localhost/standadminObsidianAdmin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Default User:&#039;&#039;&#039; Each Obsidian installation using native authentication starts with a single default user named &#039;&#039;admin&#039;&#039; with password &#039;&#039;changeme&#039;&#039;. You should change this after your first log in. See [[Admin_User_Management|User Management]] for how to change a user&#039;s password.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
At this point we suggest you play around with the admin web application. Many screens offer inline help. Otherwise, you can refer to our [[Admin Web Application Guide]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To get started writing jobs that you can run in Obsidian, see [[Implementing_Jobs|Implementing Jobs]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
See the &#039;&#039;&#039;[[User Guide]]&#039;&#039;&#039; if you have questions or wish to explore what Obsidian offers.&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Getting_Started&amp;diff=4089</id>
		<title>Getting Started</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Getting_Started&amp;diff=4089"/>
		<updated>2026-07-09T20:37:40Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This Getting Started is for Obsidian 4.0 and newer versions. See the [[Getting_Started_(3.x.x_and_earlier)|Previous Getting Started]] for prior versions.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This guide will help you choose a deployment setup that works for you, and then get it running. Before reading this page, you may wish to review Obsidian&#039;s [[Deployment Models]] to understand the different parts of Obsidian or to find out what deployment model works for you.&lt;br /&gt;
&lt;br /&gt;
If you&#039;ve are looking to start writing your own Obsidian jobs, see [[Implementing Jobs]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Supported Platforms =&lt;br /&gt;
&lt;br /&gt;
Please quickly review our supported platforms before continuing.&lt;br /&gt;
&lt;br /&gt;
* Obsidian is OS-independent, and runs on the Java Virtual Machine. It works in a variety of environments, including Linux, OSX and Windows, and can be run inside virtual machines.&lt;br /&gt;
* Obsidian 5.x.x and 6.x.x run on Java 11 or above (Obsidian 4.x.x runs on Java 1.7 or above)&lt;br /&gt;
* Obsidian&#039;s administration web application is a servlet application.&lt;br /&gt;
** 7.x.x has been tested on Tomcat 10.x&lt;br /&gt;
** 6.x.x has been tested on Tomcat 10.x and Jetty 11.x (Jakarta Servlet 5.0)&lt;br /&gt;
** 5.x.x has been tested on Tomcat 9.x and Jetty 10.x (Javax Servlet 4.0)&lt;br /&gt;
** 4.x.x has been tested on Tomcat 7, 8 &amp;amp; 8.5 and Jetty 9.x (Javax Servlet 4.0)&lt;br /&gt;
* It works on all modern browsers and is tested on recent versions of Chrome, Edge and Firefox.&lt;br /&gt;
* Obsidian requires one of the following fully-supported database platforms:&lt;br /&gt;
** MySQL 8.0.x (Obsidian 5.x and higher), 5.5-5.7 (excluding Galera)&lt;br /&gt;
** MariaDB 5.5&lt;br /&gt;
** Oracle 18c, 19c, 21c on Obsidian 5.x and higher&lt;br /&gt;
** Oracle 10g, 11.x, 12c on versions prior to Obsidian 5.0.0&lt;br /&gt;
** PostgreSQL 11-16 on Obsidian 5.x and higher&lt;br /&gt;
** PostgreSQL 9, 10&lt;br /&gt;
** MS SQL Server 2008-2019&lt;br /&gt;
** H2 1.4. &lt;br /&gt;
** &#039;&#039;Larger major versions are likely to work without issues but are not officially supported.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; With some exceptions, clustered scheduler instances require access to contact license servers over the Internet, or access to an internal proxy license server. See [[Licenses &amp;amp; Nodes]] for more information.&lt;br /&gt;
&lt;br /&gt;
== Hardware Requirements ==&lt;br /&gt;
&lt;br /&gt;
We recommend the following minimum hardware for typical installations:&lt;br /&gt;
&lt;br /&gt;
* 1 GHz processor&lt;br /&gt;
* 2 GB RAM&lt;br /&gt;
* 1 GB hard disk space (excluding accumulated logs)&lt;br /&gt;
&lt;br /&gt;
Note that actual requirements may vary depending on job volume, clustering and other factors.&lt;br /&gt;
&lt;br /&gt;
= Choose Your Installation Type =&lt;br /&gt;
&lt;br /&gt;
Obsidian consists of two main processes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scheduler&#039;&#039;&#039; - schedules and executes jobs, sends notifications, etc. Also exposes the [[Embedded API]].&lt;br /&gt;
* &#039;&#039;&#039;Admin Web Application&#039;&#039;&#039; - provides management and monitoring UI, plus the [[REST API]] and [[Embedded API]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These can be run together or separately in the following configurations. You will pick one or more of these options together to provide both the scheduler and admin web application functionality.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Standalone Scheduler&#039;&#039;&#039; - A Java process that performs job execution. A standalone scheduler installation is generated when you run the Obsidian installer, and may be customized by adding JAR files containing your job code. It is started and stopped by scripts included with the installation. Requires a separate admin web application to be deployed.&lt;br /&gt;
# &#039;&#039;&#039;Embedded Scheduler&#039;&#039;&#039; - Provides job execution like a standalone scheduler, but instead runs as a process embedded within and started from your application. This eliminates the need to customize and deploy a separate artifact which will perform job execution. Requires a separate admin web application to be deployed.&lt;br /&gt;
# &#039;&#039;&#039;Standalone Admin Web Application&#039;&#039;&#039; - A Java servlet application providing Obsidian&#039;s administration capabilities but no scheduling services.  A standalone admin application WAR file is generated when you run the Obsidian installer, and may be customized by adding JAR files containing your job code.  Requires a separate standalone, embedded or combined scheduler and web application to be deployed for job execution to be performed.&lt;br /&gt;
# &#039;&#039;&#039;Combined Scheduler and Admin Web Application&#039;&#039;&#039; - A version of the admin web application which also runs a scheduler service for job execution. A combined scheduler and admin application WAR file is generated when you run the Obsidian installer, and may be customized by adding JAR files containing your job code. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Regardless of the deployment configuration, any time you run more than one scheduler process operating against the same Obsidian database, they will automatically form a cluster and share in job execution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Choosing which installation type works best for you depends on your specific needs. The setups which are suitable for most cases are, in order: &lt;br /&gt;
&lt;br /&gt;
* Using an &#039;&#039;&#039;Embedded Scheduler&#039;&#039;&#039; (option 2), along with a &#039;&#039;&#039;Standalone Admin Web Application&#039;&#039;&#039; (option 3). This approach lets you embed Obsidian into your existing application without having to alter the Obsidian artifacts to include your job code. Instead, Obsidian&#039;s required libraries are included in your application and they are deployed together.&lt;br /&gt;
* Using a  &#039;&#039;&#039;Combined Scheduler and Admin Web Application&#039;&#039;&#039; (option 4) alone or in a cluster. This is suitable if you don&#039;t have another application containing job code for Obsidian to execute, or if you simply want to use Obsidian&#039;s scripting support, which doesn&#039;t require deploying JAR files.&lt;br /&gt;
&lt;br /&gt;
= Downloading Obsidian =&lt;br /&gt;
Just go to our [https://web.obsidianscheduler.com/download/ download page], and grab the latest Obsidian&#039;s installation zip file. There is no need to register or obtain a license before downloading.&lt;br /&gt;
&lt;br /&gt;
Once you&#039;ve downloaded the zip file, extract it to a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
If you are trying to upgrade to a newer version of Obsidian, see [[Upgrading_Obsidian|upgrade]] instructions.&lt;br /&gt;
&lt;br /&gt;
= Quick Start for Evaluation Purposes =&lt;br /&gt;
&lt;br /&gt;
If you wish to quickly try Obsidian without minimal setup required, follow these steps. Otherwise, skip ahead to [[#Initial Setup|Initial Setup]].&lt;br /&gt;
&lt;br /&gt;
== Really Quick Method Using Embedded Database ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;We do not recommend this setup for production use. &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Ensure you have a JDK (11 or up for Obsidian 6.x.x &amp;amp; 5.x.x, 1.7 or up for Obsidian 4.x.x) installed and that the &amp;lt;code&amp;gt;JAVA_HOME&amp;lt;/code&amp;gt; environment variable is set to your JDK installation directory.&lt;br /&gt;
# Unzip the Obsidian download zip file to a directory of your choice.&lt;br /&gt;
# At the command line, in the zip extraction directory, run the [[Installation_Guide|installer]] using this command, substituting the appropriate Obsidian version number: &amp;lt;code&amp;gt;java -jar Obsidian-Install-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;.jar h2-tomcat-quick-start.xml&amp;lt;/code&amp;gt;&lt;br /&gt;
# Start Obsidian using the command: &amp;lt;code&amp;gt;./webObsidian.sh start scheduler&amp;lt;/code&amp;gt; for Linux or &amp;lt;code&amp;gt;webObsidian.bat start scheduler&amp;lt;/code&amp;gt; for Windows.&lt;br /&gt;
# Go to http://localhost:8080 in your browser and check out your fully functional Obsidian web application and scheduler! You can log in to the admin web application with the default user &#039;&#039;admin&#039;&#039; and password &#039;&#039;changeme&#039;&#039;.&lt;br /&gt;
# When you&#039;re done, stop Obsidian using the command: &amp;lt;code&amp;gt;./webObsidian.sh stop&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;webObsidian.bat stop&amp;lt;/code&amp;gt; for Windows.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; If you restart the Quick Start installation and see &amp;quot;lock wait timeout&amp;quot; or similar errors in the log screen, you may have to delete your embedded H2 database lock file. By default, the file name is &#039;&#039;obsidian.lock.db&#039;&#039; and is located in the user home directory.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; If you see a &amp;lt;code&amp;gt;java.net.BindException: Permission denied&amp;lt;/code&amp;gt; error on startup, you will need to use an alternate port. See [[Troubleshooting]] for details on how to change this.&lt;br /&gt;
&lt;br /&gt;
== Quick Method Using Existing Database ==&lt;br /&gt;
&lt;br /&gt;
If you wish to get Obsidian running quickly using a database platform you already have running, follow these steps:&lt;br /&gt;
&lt;br /&gt;
# Ensure you have a JDK (11 or up for Obsidian 6.x.x and 5.x.x, 1.7 or up for Obsidian 4.x.x) installed and that the &amp;lt;code&amp;gt;JAVA_HOME&amp;lt;/code&amp;gt; environment variable is set to your JDK installation directory.&lt;br /&gt;
# Unzip the Obsidian download zip file to a directory of your choice.&lt;br /&gt;
# At the command line, in the zip extraction directory, run the [[Installation_Guide|installer]] using this command, substituting the appropriate Obsidian version number: &amp;lt;code&amp;gt;java -jar Obsidian-Install-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;.jar&amp;lt;/code&amp;gt;&lt;br /&gt;
# Start Obsidian using the command: &amp;lt;code&amp;gt;./webObsidian.sh start scheduler&amp;lt;/code&amp;gt; for Linux or &amp;lt;code&amp;gt;webObsidian.bat start scheduler&amp;lt;/code&amp;gt; for Windows.&lt;br /&gt;
# Go to http://localhost:8080 in your browser and check out your fully functional Obsidian web application and scheduler! You can log in to the admin web application with the default user &#039;&#039;admin&#039;&#039; and password &#039;&#039;changeme&#039;&#039;.&lt;br /&gt;
# When you&#039;re done, stop Obsidian using the command: &amp;lt;code&amp;gt;./webObsidian.sh stop&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;webObsidian.bat stop&amp;lt;/code&amp;gt; for Windows.&lt;br /&gt;
&lt;br /&gt;
= Initial Setup  =&lt;br /&gt;
&lt;br /&gt;
This section covers the setup required after you&#039;ve selected your [[#Choose_Your_Installation_Type|installation type]]. &lt;br /&gt;
&lt;br /&gt;
== Database ==&lt;br /&gt;
&lt;br /&gt;
Obsidian requires a database which must be created before running Obsidian. Multiple [[#Supported Platforms|database platforms]] are supported. Obsidian can share a database/schema with another application.&lt;br /&gt;
&lt;br /&gt;
Note that the database must exist before deployment, but by default Obsidian will automatically create all required tables.&lt;br /&gt;
&lt;br /&gt;
Later, you will specify database connection parameters within Obsidian&#039;s installer to tell it how to connect. If you need to configure advanced settings or change settings directly after you&#039;ve run run the installer, see [[Advanced Configuration]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Obsidian needs to create the tables in the target database. If the schema is shared with your application’s tables, please ensure there are no name conflicts. If there are conflicts, separate schemas/databases can be used, or a table prefix can be specified as shown in [[Advanced_Configuration#Database_Properties|Advanced Configuration]]. [[Obsidian Tables]] lists the tables Obsidian will created upon first deployment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Manual Schema Creation ===&lt;br /&gt;
&lt;br /&gt;
When you start Obsidian, it will automatically detect and create missing tables in your target database. However, if you wish to run Obsidian with a database user that does not have create privileges, or simply wish to prepare your database structure ahead of time, you can use the database scripts provided with your download zip file under the &amp;quot;db_scripts&amp;quot; directory.&lt;br /&gt;
&lt;br /&gt;
First create your database, and locate the &amp;quot;complete.sql&amp;quot; file under the directory for the database you are using under the &amp;quot;db_scripts&amp;quot; directory. Statements within this file contain the token &amp;quot;$px$&amp;quot; to enable table prefixes. Before you run the SQL file, replace all instances of the token &amp;quot;$px$&amp;quot; (without quotes) with a table prefix 6 characters or shorter (letters and underscores supported), or with blank.&lt;br /&gt;
&lt;br /&gt;
Then, in your SQL client of choice, execute the script and all the required Obsidian tables will be created.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Alternate Oracle Schemas ===&lt;br /&gt;
&lt;br /&gt;
After allowing Obsidian to create all the required tables and initial data by deploying it a single time, Obsidian can be run with an alternate Oracle user by specifying the target schema on Oracle databases. See [[Advanced_Configuration#Database_Properties|Advanced Configuration]] for the property to set.&lt;br /&gt;
&lt;br /&gt;
If you use a separate user from the schema owner, you must grant the user [[Obsidian_Tables#Oracle Privileges|certain privileges]] for Obsidian to function correctly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MS SQL Server Snapshot Isolation ===&lt;br /&gt;
&lt;br /&gt;
For maximum compatibility and to avoid deadlocks, MS SQL Server should be configured to use [https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/sql/snapshot-isolation-in-sql-server read committed snapshot isolation].&lt;br /&gt;
&lt;br /&gt;
This can be enabled on your database by running the following commands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER DATABASE MyDatabase SET ALLOW_SNAPSHOT_ISOLATION ON&lt;br /&gt;
ALTER DATABASE MyDatabase SET READ_COMMITTED_SNAPSHOT ON&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
&lt;br /&gt;
By default, Obsidian manages its own set users and logins to restrict access to the admin web application and REST API. A default “admin” user is created when the scheduler is first deployed and no additional setup is required.&lt;br /&gt;
&lt;br /&gt;
Alternatively, to use LDAP authentication, select the LDAP option in the installer and enter your LDAP details.&lt;br /&gt;
&lt;br /&gt;
As of 7.0.0, you can also select OAuth / OIDC authentication to enable Single Sign-On via an external identity provider. See [[Authenticator#OAuthAuthenticator_(OIDC_SSO)|OAuthAuthenticator]] for details.&lt;br /&gt;
&lt;br /&gt;
Finally, you may implement your own [[authenticator|custom authenticator]] Java class, which you also enter when running the installer.&lt;br /&gt;
&lt;br /&gt;
= Running the Installer =&lt;br /&gt;
&lt;br /&gt;
Now that you&#039;ve chosen your installation type and performed initial setup of your database and authentication, you can run Obsidian&#039;s installer to configure and build a set of artifacts that you can either use to embed Obsidian, or deploy directly.&lt;br /&gt;
&lt;br /&gt;
To run the installer, please follow our detailed [[Installation_Guide|installation guide]].&lt;br /&gt;
&lt;br /&gt;
=== Installer-Created Artifacts ===&lt;br /&gt;
&lt;br /&gt;
Once you&#039;ve run the installer, your installation directory will look something like the following, depending on which artifacts you chose to generate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
├───db_scripts&lt;br /&gt;
└───Obsidian-7.0.0&lt;br /&gt;
    │   com.carfey.yaml.reference&lt;br /&gt;
    │   obsidian.war&lt;br /&gt;
    │   obsidian-builtin-job-src.jar&lt;br /&gt;
    │   obsidianForkedJob.bat&lt;br /&gt;
    │   obsidianForkedJob.sh&lt;br /&gt;
    │   obsidian-javadoc.zip&lt;br /&gt;
    │   standaloneObsidian.bat&lt;br /&gt;
    │   standaloneObsidian.sh&lt;br /&gt;
    │   standaloneObsidianAdmin.war&lt;br /&gt;
    │   webObsidian.bat&lt;br /&gt;
    │   webObsidian.sh&lt;br /&gt;
    │&lt;br /&gt;
    ├───embed-tomcat-lib  (present when an Embedded Tomcat pack is selected)&lt;br /&gt;
    ├───license&lt;br /&gt;
    ├───logs&lt;br /&gt;
    └───standalone&lt;br /&gt;
        (various JAR files...)&lt;br /&gt;
        obsidian-yaml-configuration.jar&lt;br /&gt;
        obsidian.jar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The installer creates a top-level directory named &#039;&#039;&#039;Obsidian-n.n.n&#039;&#039;&#039; containing generated artifacts. The key files and directories are:&lt;br /&gt;
&lt;br /&gt;
; com.carfey.yaml.reference or com.carfey.properties.reference&lt;br /&gt;
: Copy of the configuration file generated by the installer.&lt;br /&gt;
; obsidian.war&lt;br /&gt;
: Combined scheduler and admin web application WAR. Deploy directly to a servlet container, or run locally using the Embedded Tomcat pack (see below). Customise by adding your job code and dependencies as JARs to &#039;&#039;&#039;/WEB-INF/lib&#039;&#039;&#039; within the archive.&lt;br /&gt;
; standaloneObsidian.bat and standaloneObsidian.sh&lt;br /&gt;
: Windows and Linux scripts to start the standalone scheduler process with no web application. Customise by adding your job code and dependencies as JARs to the &#039;&#039;&#039;standalone&#039;&#039;&#039; directory.&lt;br /&gt;
; webObsidian.bat and webObsidian.sh&lt;br /&gt;
: Windows and Linux scripts to start Obsidian using the embedded Tomcat runtime (requires the &#039;&#039;&#039;Obsidian Embedded Tomcat JAR&#039;&#039;&#039; or &#039;&#039;&#039;Obsidian Standalone Admin Embedded Tomcat JAR&#039;&#039;&#039; pack). Use &#039;&#039;&#039;start scheduler&#039;&#039;&#039; to run the combined scheduler+admin WAR, or &#039;&#039;&#039;start adminOnly&#039;&#039;&#039; to run the standalone admin WAR. Stop with &#039;&#039;&#039;stop&#039;&#039;&#039;.&lt;br /&gt;
; standaloneObsidianAdmin.war&lt;br /&gt;
: Standalone admin web application WAR (no scheduler). Deploy directly to a servlet container or run via the embedded Tomcat pack.&lt;br /&gt;
; embed-tomcat-lib&lt;br /&gt;
: Present when an Embedded Tomcat pack is selected. Contains the embedded Tomcat runtime JARs used by the &#039;&#039;&#039;webObsidian&#039;&#039;&#039; scripts.&lt;br /&gt;
; standalone&lt;br /&gt;
: Directory containing JARs required to run the standalone scheduler process. &#039;&#039;&#039;obsidian-yaml-configuration.jar&#039;&#039;&#039; or &#039;&#039;&#039;obsidian-properties-configuration.jar&#039;&#039;&#039; contains the Obsidian configuration file. To make configuration changes for the standalone scheduler, update the configuration file within this JAR.&lt;br /&gt;
&lt;br /&gt;
=== Starting Obsidian with embedded Tomcat ===&lt;br /&gt;
&lt;br /&gt;
If you selected the &#039;&#039;&#039;Obsidian Embedded Tomcat JAR&#039;&#039;&#039; or &#039;&#039;&#039;Obsidian Standalone Admin Embedded Tomcat JAR&#039;&#039;&#039; pack during installation, use the &#039;&#039;&#039;webObsidian&#039;&#039;&#039; scripts to start and stop Obsidian.&lt;br /&gt;
&lt;br /&gt;
From the Obsidian install directory:&lt;br /&gt;
&lt;br /&gt;
 webObsidian.bat start scheduler&lt;br /&gt;
 (Unix: ./webObsidian.sh start scheduler)&lt;br /&gt;
&lt;br /&gt;
For standalone admin only:&lt;br /&gt;
&lt;br /&gt;
 webObsidian.bat start adminOnly&lt;br /&gt;
&lt;br /&gt;
Stop:&lt;br /&gt;
&lt;br /&gt;
 webObsidian.bat stop&lt;br /&gt;
 (Unix: ./webObsidian.sh stop)&lt;br /&gt;
&lt;br /&gt;
Default HTTP port is &#039;&#039;&#039;8080&#039;&#039;&#039;. To change ports, pass &#039;&#039;&#039;-Dembedded.tomcat.http.port&#039;&#039;&#039;, &#039;&#039;&#039;-Dembedded.tomcat.stop.port&#039;&#039;&#039;, and &#039;&#039;&#039;-Dembedded.tomcat.stop.key&#039;&#039;&#039; as JVM arguments before starting.&lt;br /&gt;
&lt;br /&gt;
If you are deploying &#039;&#039;&#039;obsidian.war&#039;&#039;&#039; to your own external servlet container instead, refer to your container&#039;s deployment documentation.&lt;br /&gt;
&lt;br /&gt;
= Embedding Obsidian &amp;amp; Customizing Artifacts =&lt;br /&gt;
&lt;br /&gt;
The Obsidian scheduler process needs Java classpath access to your jobs so it can detect valid jobs and execute them. This requires a bit of customization before you are ready to run custom Java jobs. If you still haven&#039;t created your custom jobs, consult [[Implementing Jobs]] before proceeding. If you only intend to use [[Scripting Jobs]], customization will not be required and you can skip to [[#Deployment|Deployment]].&lt;br /&gt;
&lt;br /&gt;
If you want to embed Obsidian into your application or need to deploy jobs and their dependent libraries to the generated Obsidian artifacts, follow the steps in the appropriate sections below.&lt;br /&gt;
&lt;br /&gt;
Note that only Obsidian scheduler processes need to be customized to include your job code. The admin web application itself does not require classpath access to your jobs.&lt;br /&gt;
&lt;br /&gt;
== Embedding Obsidian - Importing Libraries and Properties File ==&lt;br /&gt;
&lt;br /&gt;
To embed Obsidian, you will need to update your application build to bring in the JAR files it requires, along with the Obsidian properties file. Simply follow these steps:&lt;br /&gt;
&lt;br /&gt;
# Import all required [[Advanced_Configuration#Dependent_Libraries|Obsidian JAR files]] into your project and reference them in your build files. &lt;br /&gt;
#* These can be obtained from the &amp;lt;code&amp;gt;standalone&amp;lt;/code&amp;gt; directory of your installation. Make sure you &#039;&#039;&#039;exclude&#039;&#039;&#039; &amp;lt;code&amp;gt;obsidian-(yaml/properties)-configuration.jar&amp;lt;/code&amp;gt;&lt;br /&gt;
#* Ensure your Maven, Gradle or Ant files are updated to include all required libraries in your build, along with your IDE.&lt;br /&gt;
# Make a copy of &amp;lt;code&amp;gt;com.carfey.yaml.reference&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;com.carfey.properties.reference&amp;lt;/code&amp;gt; from your installation with the &amp;lt;code&amp;gt;.reference&amp;lt;/code&amp;gt; suffix removed, and add it to your project&#039;s classpath.&lt;br /&gt;
#* This is typically just a matter of adding it to your project&#039;s resources directory.&lt;br /&gt;
#* From now on, you can update this file to change the various configuration options such as database connection details.&lt;br /&gt;
#* You may wish to leave this file out of source control and let developers configure their own installations. However, any running Obsidian instance will need access to a valid [[Advanced_Configuration#Properties.2FYaml_File|properties file]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Maven users:&#039;&#039;&#039; Note that we do not publish Maven artifacts for Obsidian, so you will not be able to include them by referencing a public repository.&lt;br /&gt;
&lt;br /&gt;
== Adding Custom Jobs to Standalone Scheduler ==&lt;br /&gt;
&lt;br /&gt;
In order for the standalone scheduler to detect and execute custom jobs written in Java, you will need to ensure Obsidian&#039;s classpath contains the compiled job code, along with its dependencies.&lt;br /&gt;
&lt;br /&gt;
To do so, you need to perform just one step before starting the standalone scheduler:&lt;br /&gt;
&lt;br /&gt;
# Copy JAR files containing custom Obsidian jobs and all runtime dependencies to the &amp;lt;code&amp;gt;standalone&amp;lt;/code&amp;gt; directory in your installation.&lt;br /&gt;
#* These JARs should be alongside &amp;lt;code&amp;gt;obsidian.jar&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* All JAR files in this directory will be automatically added to the classpath when run via the &amp;lt;code&amp;gt;standaloneObsidian.sh&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;standaloneObsidian.bat&amp;lt;/code&amp;gt; scripts.&lt;br /&gt;
&lt;br /&gt;
== Adding Custom Jobs to Combined Scheduler and Admin Web Application ==&lt;br /&gt;
&lt;br /&gt;
In order for the combined scheduler and admin web application to detect and execute custom jobs written in Java, you will need to ensure Obsidian&#039;s classpath contains the compiled job code, along with its dependencies.&lt;br /&gt;
&lt;br /&gt;
To do so, you need to perform just one step before deploying the Obsidian WAR file:&lt;br /&gt;
&lt;br /&gt;
# Copy JAR files containing custom Obsidian jobs and all runtime dependencies to the &amp;lt;code&amp;gt;WEB-INF/lib&amp;lt;/code&amp;gt; directory within the WAR archive.&lt;br /&gt;
#* These JARs should be alongside &amp;lt;code&amp;gt;obsidian.jar&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* WAR files use the ZIP format and can be extracted and recompressed with normal ZIP tools or the JDK &amp;lt;code&amp;gt;jar&amp;lt;/code&amp;gt; utility.&lt;br /&gt;
&lt;br /&gt;
== Updating the Properties File in Admin Web Applications ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Note that updating the WAR artifact is not necessary to perform properties file changes when using an external properties file as described [[Advanced_Configuration#Properties_File|here]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you need to change [[Advanced_Configuration#Properties_File|configuration properties]] for a standalone admin web application or combined scheduler and admin web application, follow these steps:&lt;br /&gt;
&lt;br /&gt;
# Obtain the WAR artifact from your installation that requires changes. This is either &amp;lt;code&amp;gt;obsidian.war&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;standaloneObsidianAdmin.war&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Extract the WAR file to a clean directory.&lt;br /&gt;
# Edit the &amp;lt;code&amp;gt;com.carfey.(yaml/properties)&amp;lt;/code&amp;gt; file within the subdirectory &amp;lt;code&amp;gt;WEB-INF/classes&amp;lt;/code&amp;gt; and save your changes.&lt;br /&gt;
# Rebundled the WAR artifact using a zip utility or the JDK &amp;lt;code&amp;gt;jar&amp;lt;/code&amp;gt; utility.&lt;br /&gt;
#* Some zip utilities such as 7Zip will allow you to edit files within an archive directly without the previous steps. It is generally safe to do so.&lt;br /&gt;
&lt;br /&gt;
= Deployment =&lt;br /&gt;
&lt;br /&gt;
You are now ready to deploy your scheduler and/or admin web application.&lt;br /&gt;
&lt;br /&gt;
== Embedded Scheduler ==&lt;br /&gt;
&lt;br /&gt;
When Obsidian is embedded, there is no separate deployment process. However, you will need to start and stop Obsidian with your application. If you are using Spring, we recommend you use our [[Spring Integration]] instead, which will automatically start and stop the scheduler for you.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
During your application startup, once it is fully initialized (or as close as possible), start Obsidian, and save a reference to the returned result so you can shut it down later:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// This will start the scheduler on the first call to get().&lt;br /&gt;
&lt;br /&gt;
com.carfey.ops.job.SchedulerStarter starter = com.carfey.ops.job.SchedulerStarter.get(com.carfey.ops.job.SchedulerStarter.SchedulerMode.EMBEDDED);&lt;br /&gt;
&lt;br /&gt;
// ...&lt;br /&gt;
&lt;br /&gt;
// Later, we need to gracefully shut down the scheduler &lt;br /&gt;
starter.shutDown();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will run Obsidian&#039;s scheduler process, but will not include any of the web application or the REST API. This functionality is provided by the admin web application.&lt;br /&gt;
&lt;br /&gt;
== Standalone Admin Web Application ==&lt;br /&gt;
&lt;br /&gt;
To deploy the standalone admin web application, simply deploy the &amp;lt;code&amp;gt;standaloneObsidianAdmin.war&amp;lt;/code&amp;gt; file your servlet container of choice (e.g. Tomcat) after configuring it appropriately. You may rename the WAR file to have it deployed under a different context path, if desired (e.g. &amp;quot;ROOT.war&amp;quot; or &amp;quot;obsidian.war&amp;quot;). Consult your servlet documentation to find out how to deploy the application and start the servlet container.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; If you want to use the included Jetty server as your servlet container, you can use the scripts included in your installation instead of deploying the WAR. This will make the application accessible at http://localhost:8080.&lt;br /&gt;
* To start &lt;br /&gt;
** Linux: &amp;lt;code&amp;gt;./webObsidian.sh start adminOnly&amp;lt;/code&amp;gt;&lt;br /&gt;
** Windows: &amp;lt;code&amp;gt;webObsidian.bat start adminOnly&amp;lt;/code&amp;gt;&lt;br /&gt;
* To stop&lt;br /&gt;
** Linux: &amp;lt;code&amp;gt;./webObsidian.sh stop&amp;lt;/code&amp;gt; &lt;br /&gt;
** Windows: &amp;lt;code&amp;gt;webObsidian.bat stop&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Security Note:&#039;&#039;&#039; By default, the admin web application allows non-secure connections. If you wish to force secure connections through HTTPS, you can edit the web.xml in your war and uncomment the &amp;lt;security-constraint&amp;gt; element in the file. This will force all requests to redirect to an encrypted connection. For details on setting up SSL on your servlet container, refer to its documentation.&lt;br /&gt;
&lt;br /&gt;
== Standalone Scheduler ==&lt;br /&gt;
&lt;br /&gt;
To deploy and run the standalone scheduler, you may use the provided scripts in your installation directory:&lt;br /&gt;
* Linux: &amp;lt;code&amp;gt;./standaloneObsidian.sh start&amp;lt;/code&amp;gt;&lt;br /&gt;
* Windows: &amp;lt;code&amp;gt;standaloneObsidian.bat start&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You should always stop Obsidian gracefully when possible by using:&lt;br /&gt;
* Linux: &amp;lt;code&amp;gt;./standaloneObsidian.sh stop&amp;lt;/code&amp;gt;&lt;br /&gt;
* Windows: &amp;lt;code&amp;gt;standaloneObsidian.bat stop&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Both the start and stop commands may be supplied an additional argument to override the &amp;lt;code&amp;gt;listenerPort&amp;lt;/code&amp;gt; which defaults to 10451.&lt;br /&gt;
&lt;br /&gt;
Rather than use one of the provided scripts, you can invoke the equivalent Java command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java com.carfey.ops.job.SchedulerStarter start &amp;lt;listenerPort&amp;gt;&lt;br /&gt;
java com.carfey.ops.job.SchedulerStarter stop &amp;lt;listenerPort&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Combined Scheduler and Admin Web Application ==&lt;br /&gt;
&lt;br /&gt;
To deploy the combined scheduler and admin web application, simply deploy the &amp;lt;code&amp;gt;obsidian.war&amp;lt;/code&amp;gt; file your servlet container of choice (e.g. Tomcat) after configuring it appropriately. You may rename the WAR file to have it deployed under a different context path, if desired (e.g. &amp;quot;ROOT.war&amp;quot;). Consult your servlet documentation to find out how to deploy the application and start the servlet container.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; If you want to use the included Jetty server as your servlet container, you can use the scripts included in your installation instead of deploying the WAR.  This will make the web application accessible at the URL http://localhost:8080.&lt;br /&gt;
&lt;br /&gt;
* To start &lt;br /&gt;
** Linux: &amp;lt;code&amp;gt;./webObsidian.sh start scheduler&amp;lt;/code&amp;gt;&lt;br /&gt;
** Windows: &amp;lt;code&amp;gt;webObsidian.bat start scheduler&amp;lt;/code&amp;gt;&lt;br /&gt;
* To stop&lt;br /&gt;
** Linux: &amp;lt;code&amp;gt;./webObsidian.sh stop&amp;lt;/code&amp;gt; &lt;br /&gt;
** Windows: &amp;lt;code&amp;gt;webObsidian.bat stop&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Security Note:&#039;&#039;&#039; By default, the admin web application allows non-secure connections. If you wish to force secure connections through HTTPS, you can edit the web.xml in your war and uncomment the &amp;lt;security-constraint&amp;gt; element in the file. This will force all requests to redirect to an encrypted connection. For details on setting up SSL on your servlet container, refer to its documentation.&lt;br /&gt;
&lt;br /&gt;
== Embedding the Obsidian Web Application in Another Web Application ==&lt;br /&gt;
&lt;br /&gt;
We do not generally recommend attempting to merge the Obsidian admin web application with another servlet web application, but it can be done by following these steps:&lt;br /&gt;
&lt;br /&gt;
To embed the full Obsidian web application in an existing web application, you will need to extract the necessary sections from the &amp;lt;code&amp;gt;WEB-INF/web.xml&amp;lt;/code&amp;gt; file in the &amp;lt;code&amp;gt;obsidian.war&amp;lt;/code&amp;gt; file and merge them into your application&#039;s &amp;lt;code&amp;gt;web.xml&amp;lt;/code&amp;gt; file. This includes all &amp;quot;listener&amp;quot;, &amp;quot;servlet&amp;quot;, &amp;quot;servlet-mapping&amp;quot;, &amp;quot;jsp-config&amp;quot;, &amp;quot;filter&amp;quot;, &amp;quot;filter-mapping&amp;quot; elements, and optionally &amp;quot;welcome-file-list&amp;quot; and &amp;quot;error-page&amp;quot; elements. Ensure that all servlet paths are maintained. If you are using a different servlet specification version, you may need to update the mappings to the appropriate format.&lt;br /&gt;
&lt;br /&gt;
Note the use of our &amp;lt;code&amp;gt;com.carfey.ops.servlet.StartupShutdownListener&amp;lt;/code&amp;gt; which takes care of starting up the scheduler instance and using the web container&#039;s default shutdown mechanism to ensure graceful shutdown. This listener will start Obsidian&#039;s scheduler process and initialize the Obsidian web application. &lt;br /&gt;
&lt;br /&gt;
If you wish to embed Obsidian&#039;s web application without the scheduler running, include the following parameter element in your &amp;lt;code&amp;gt;web.xml&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;context-param&amp;gt;&lt;br /&gt;
   &amp;lt;param-name&amp;gt;schedulerEnabled&amp;lt;/param-name&amp;gt;&lt;br /&gt;
   &amp;lt;param-value&amp;gt;false&amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Additional Deployment Details ==&lt;br /&gt;
&lt;br /&gt;
=== Classpath Notes ===&lt;br /&gt;
&lt;br /&gt;
To run a scheduler with your custom code and jobs, you need to ensure the scheduler process classpath includes your code packaged into JAR files, as described [[#Embedding_Obsidian_.26_Customizing_Artifacts|above]]. &lt;br /&gt;
&lt;br /&gt;
If a compiled job is updated, you will have to restart your application or the servlet container after deploying updated jars, unless you are using [[Job Forking]].&lt;br /&gt;
&lt;br /&gt;
=== Setting Host Names ===&lt;br /&gt;
Obsidian instances will automatically assign themselves host names if no host name is explicitly set, but you may wish to give them explicit names to make scheduling and monitoring simpler.&lt;br /&gt;
&lt;br /&gt;
If you wish to assign explicit names, simply set the Java system property &amp;lt;code&amp;gt;schedulerDesignation&amp;lt;/code&amp;gt; to the host name of your choice. For example, if starting an instance using the standalone scheduler using &amp;lt;code&amp;gt;java&amp;lt;/code&amp;gt; directly, simply add the value &amp;lt;code&amp;gt;-DschedulerDesignation=myHostName&amp;lt;/code&amp;gt; to the end of the command.&lt;br /&gt;
&lt;br /&gt;
You may also use a properties file setting for the host name as detailed in [[Advanced Configuration]].&lt;br /&gt;
&lt;br /&gt;
=== Disabling Automatic Database Updates ===&lt;br /&gt;
&lt;br /&gt;
Obsidian automatically applies schema updates and data upgrades to its database on startup. In some cases, it may be desirable to disable this once the database has been fully initialized and upgrades to new versions are not going to be deployed. For example, you may wish to run Obsidian with a user who does not have privileges to modify the database schema.&lt;br /&gt;
&lt;br /&gt;
To do so, you can either set a Java system property, or if you are using the admin web application WAR, you can add a setting to your &amp;lt;code&amp;gt;WEB-INF/web.xml&amp;lt;/code&amp;gt; within the archive.&lt;br /&gt;
&lt;br /&gt;
As a system property:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-DstartupRunnerClass=com.carfey.ops.run.NullRunner&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In &amp;lt;code&amp;gt;WEB-INF/web.xml&amp;lt;/code&amp;gt;, after any &amp;lt;code&amp;gt;listener&amp;lt;/code&amp;gt; elements:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;context-param&amp;gt;&lt;br /&gt;
    &amp;lt;param-name&amp;gt;startupRunnerClass&amp;lt;/param-name&amp;gt;&lt;br /&gt;
    &amp;lt;param-value&amp;gt;com.carfey.ops.run.NullRunner&amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Disabling DDL Updates ===&lt;br /&gt;
&lt;br /&gt;
It may also be helpful to apply schema updates (DDL) outside Obsidian through a privileged account, but allow Obsidian upgrades to make the necessary data initialization/modifications. This can be done using a &#039;&#039;&#039;skipDDL&#039;&#039;&#039; configuration property documented under [[Advanced_Configuration#Miscellaneous_Properties | Advanced Configuration]].&lt;br /&gt;
&lt;br /&gt;
=== Disabling Job Scheduling in the Web Application ===&lt;br /&gt;
&lt;br /&gt;
If you have combined scheduler and admin web application WAR already built, you can easily tweak it to disable the scheduler process. &lt;br /&gt;
&lt;br /&gt;
Simply add the following to your &amp;lt;code&amp;gt;WEB-INF/web.xml&amp;lt;/code&amp;gt; within the WAR archive after any &amp;lt;code&amp;gt;listener&amp;lt;/code&amp;gt; elements:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;context-param&amp;gt;&lt;br /&gt;
    &amp;lt;param-name&amp;gt;schedulerEnabled&amp;lt;/param-name&amp;gt;&lt;br /&gt;
    &amp;lt;param-value&amp;gt;false&amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= You’re Good to Go! =&lt;br /&gt;
&lt;br /&gt;
You&#039;re now ready to log into the web application and start scheduling jobs! The URL you use to access Obsidian will depend on how it&#039;s been deployed, but will typically be something like http://localhost/obsidian, or http://localhost/standadminObsidianAdmin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Default User:&#039;&#039;&#039; Each Obsidian installation using native authentication starts with a single default user named &#039;&#039;admin&#039;&#039; with password &#039;&#039;changeme&#039;&#039;. You should change this after your first log in. See [[Admin_User_Management|User Management]] for how to change a user&#039;s password.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
At this point we suggest you play around with the admin web application. Many screens offer inline help. Otherwise, you can refer to our [[Admin Web Application Guide]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To get started writing jobs that you can run in Obsidian, see [[Implementing_Jobs|Implementing Jobs]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
See the &#039;&#039;&#039;[[User Guide]]&#039;&#039;&#039; if you have questions or wish to explore what Obsidian offers.&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Getting_Started&amp;diff=4088</id>
		<title>Getting Started</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Getting_Started&amp;diff=4088"/>
		<updated>2026-07-09T20:36:16Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This Getting Started is for Obsidian 4.0 and newer versions. See the [[Getting_Started_(3.x.x_and_earlier)|Previous Getting Started]] for prior versions.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This guide will help you choose a deployment setup that works for you, and then get it running. Before reading this page, you may wish to review Obsidian&#039;s [[Deployment Models]] to understand the different parts of Obsidian or to find out what deployment model works for you.&lt;br /&gt;
&lt;br /&gt;
If you&#039;ve are looking to start writing your own Obsidian jobs, see [[Implementing Jobs]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Supported Platforms =&lt;br /&gt;
&lt;br /&gt;
Please quickly review our supported platforms before continuing.&lt;br /&gt;
&lt;br /&gt;
* Obsidian is OS-independent, and runs on the Java Virtual Machine. It works in a variety of environments, including Linux, OSX and Windows, and can be run inside virtual machines.&lt;br /&gt;
* Obsidian 5.x.x and 6.x.x run on Java 11 or above (Obsidian 4.x.x runs on Java 1.7 or above)&lt;br /&gt;
* Obsidian&#039;s administration web application is a servlet application.&lt;br /&gt;
** 7.x.x has been tested on Tomcat 10.x&lt;br /&gt;
** 6.x.x has been tested on Tomcat 10.x and Jetty 11.x (Jakarta Servlet 5.0)&lt;br /&gt;
** 5.x.x has been tested on Tomcat 9.x and Jetty 10.x (Javax Servlet 4.0)&lt;br /&gt;
** 4.x.x has been tested on Tomcat 7, 8 &amp;amp; 8.5 and Jetty 9.x (Javax Servlet 4.0)&lt;br /&gt;
* It works on all modern browsers and is tested on recent versions of Chrome, Edge and Firefox.&lt;br /&gt;
* Obsidian requires one of the following fully-supported database platforms:&lt;br /&gt;
** MySQL 8.0.x (Obsidian 5.x and higher), 5.5-5.7 (excluding Galera)&lt;br /&gt;
** MariaDB 5.5&lt;br /&gt;
** Oracle 18c, 19c, 21c on Obsidian 5.x and higher&lt;br /&gt;
** Oracle 10g, 11.x, 12c on versions prior to Obsidian 5.0.0&lt;br /&gt;
** PostgreSQL 11-16 on Obsidian 5.x and higher&lt;br /&gt;
** PostgreSQL 9, 10&lt;br /&gt;
** MS SQL Server 2008-2019&lt;br /&gt;
** H2 1.4. &lt;br /&gt;
** &#039;&#039;Larger major versions are likely to work without issues but are not officially supported.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; With some exceptions, clustered scheduler instances require access to contact license servers over the Internet, or access to an internal proxy license server. See [[Licenses &amp;amp; Nodes]] for more information.&lt;br /&gt;
&lt;br /&gt;
== Hardware Requirements ==&lt;br /&gt;
&lt;br /&gt;
We recommend the following minimum hardware for typical installations:&lt;br /&gt;
&lt;br /&gt;
* 1 GHz processor&lt;br /&gt;
* 2 GB RAM&lt;br /&gt;
* 1 GB hard disk space (excluding accumulated logs)&lt;br /&gt;
&lt;br /&gt;
Note that actual requirements may vary depending on job volume, clustering and other factors.&lt;br /&gt;
&lt;br /&gt;
= Choose Your Installation Type =&lt;br /&gt;
&lt;br /&gt;
Obsidian consists of two main processes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scheduler&#039;&#039;&#039; - schedules and executes jobs, sends notifications, etc. Also exposes the [[Embedded API]].&lt;br /&gt;
* &#039;&#039;&#039;Admin Web Application&#039;&#039;&#039; - provides management and monitoring UI, plus the [[REST API]] and [[Embedded API]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These can be run together or separately in the following configurations. You will pick one or more of these options together to provide both the scheduler and admin web application functionality.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Standalone Scheduler&#039;&#039;&#039; - A Java process that performs job execution. A standalone scheduler installation is generated when you run the Obsidian installer, and may be customized by adding JAR files containing your job code. It is started and stopped by scripts included with the installation. Requires a separate admin web application to be deployed.&lt;br /&gt;
# &#039;&#039;&#039;Embedded Scheduler&#039;&#039;&#039; - Provides job execution like a standalone scheduler, but instead runs as a process embedded within and started from your application. This eliminates the need to customize and deploy a separate artifact which will perform job execution. Requires a separate admin web application to be deployed.&lt;br /&gt;
# &#039;&#039;&#039;Standalone Admin Web Application&#039;&#039;&#039; - A Java servlet application providing Obsidian&#039;s administration capabilities but no scheduling services.  A standalone admin application WAR file is generated when you run the Obsidian installer, and may be customized by adding JAR files containing your job code.  Requires a separate standalone, embedded or combined scheduler and web application to be deployed for job execution to be performed.&lt;br /&gt;
# &#039;&#039;&#039;Combined Scheduler and Admin Web Application&#039;&#039;&#039; - A version of the admin web application which also runs a scheduler service for job execution. A combined scheduler and admin application WAR file is generated when you run the Obsidian installer, and may be customized by adding JAR files containing your job code. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Regardless of the deployment configuration, any time you run more than one scheduler process operating against the same Obsidian database, they will automatically form a cluster and share in job execution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Choosing which installation type works best for you depends on your specific needs. The setups which are suitable for most cases are, in order: &lt;br /&gt;
&lt;br /&gt;
* Using an &#039;&#039;&#039;Embedded Scheduler&#039;&#039;&#039; (option 2), along with a &#039;&#039;&#039;Standalone Admin Web Application&#039;&#039;&#039; (option 3). This approach lets you embed Obsidian into your existing application without having to alter the Obsidian artifacts to include your job code. Instead, Obsidian&#039;s required libraries are included in your application and they are deployed together.&lt;br /&gt;
* Using a  &#039;&#039;&#039;Combined Scheduler and Admin Web Application&#039;&#039;&#039; (option 4) alone or in a cluster. This is suitable if you don&#039;t have another application containing job code for Obsidian to execute, or if you simply want to use Obsidian&#039;s scripting support, which doesn&#039;t require deploying JAR files.&lt;br /&gt;
&lt;br /&gt;
= Downloading Obsidian =&lt;br /&gt;
Just go to our [https://web.obsidianscheduler.com/download/ download page], and grab the latest Obsidian&#039;s installation zip file. There is no need to register or obtain a license before downloading.&lt;br /&gt;
&lt;br /&gt;
Once you&#039;ve downloaded the zip file, extract it to a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
If you are trying to upgrade to a newer version of Obsidian, see [[Upgrading_Obsidian|upgrade]] instructions.&lt;br /&gt;
&lt;br /&gt;
= Quick Start for Evaluation Purposes =&lt;br /&gt;
&lt;br /&gt;
If you wish to quickly try Obsidian without minimal setup required, follow these steps. Otherwise, skip ahead to [[#Initial Setup|Initial Setup]].&lt;br /&gt;
&lt;br /&gt;
== Really Quick Method Using Embedded Database ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;We do not recommend this setup for production use. &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Ensure you have a JDK (11 or up for Obsidian 6.x.x &amp;amp; 5.x.x, 1.7 or up for Obsidian 4.x.x) installed and that the &amp;lt;code&amp;gt;JAVA_HOME&amp;lt;/code&amp;gt; environment variable is set to your JDK installation directory.&lt;br /&gt;
# Unzip the Obsidian download zip file to a directory of your choice.&lt;br /&gt;
# At the command line, in the zip extraction directory, run the [[Installation_Guide|installer]] using this command, substituting the appropriate Obsidian version number: &amp;lt;code&amp;gt;java -jar Obsidian-Install-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;.jar h2-tomcat-quick-start.xml&amp;lt;/code&amp;gt;&lt;br /&gt;
# Start Obsidian using the command: &amp;lt;code&amp;gt;./webObsidian.sh start scheduler&amp;lt;/code&amp;gt; for Linux or &amp;lt;code&amp;gt;webObsidian.bat start scheduler&amp;lt;/code&amp;gt; for Windows.&lt;br /&gt;
# Go to http://localhost:8080 in your browser and check out your fully functional Obsidian web application and scheduler! You can log in to the admin web application with the default user &#039;&#039;admin&#039;&#039; and password &#039;&#039;changeme&#039;&#039;.&lt;br /&gt;
# When you&#039;re done, stop Obsidian using the command: &amp;lt;code&amp;gt;./webObsidian.sh stop&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;webObsidian.bat stop&amp;lt;/code&amp;gt; for Windows.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; If you restart the Quick Start installation and see &amp;quot;lock wait timeout&amp;quot; or similar errors in the log screen, you may have to delete your embedded H2 database lock file. By default, the file name is &#039;&#039;obsidian.lock.db&#039;&#039; and is located in the user home directory.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; If you see a &amp;lt;code&amp;gt;java.net.BindException: Permission denied&amp;lt;/code&amp;gt; error on startup, you will need to use an alternate port. See [[Troubleshooting]] for details on how to change this.&lt;br /&gt;
&lt;br /&gt;
=== Starting embedded Tomcat ===&lt;br /&gt;
&lt;br /&gt;
From the Obsidian install directory:&lt;br /&gt;
&lt;br /&gt;
 webObsidian.bat start scheduler&lt;br /&gt;
 (Unix: ./webObsidian.sh start scheduler)&lt;br /&gt;
&lt;br /&gt;
For standalone admin only:&lt;br /&gt;
&lt;br /&gt;
 webObsidian.bat start adminOnly&lt;br /&gt;
&lt;br /&gt;
Stop:&lt;br /&gt;
&lt;br /&gt;
 webObsidian.bat stop&lt;br /&gt;
 (Unix: ./webObsidian.sh stop)&lt;br /&gt;
&lt;br /&gt;
Default HTTP port is &#039;&#039;&#039;8080&#039;&#039;&#039;. To change ports, pass &#039;&#039;&#039;-Dembedded.tomcat.http.port&#039;&#039;&#039;, &#039;&#039;&#039;-Dembedded.tomcat.stop.port&#039;&#039;&#039;, and &#039;&#039;&#039;-Dembedded.tomcat.stop.key&#039;&#039;&#039; as JVM arguments before starting.&lt;br /&gt;
&lt;br /&gt;
== Quick Method Using Existing Database ==&lt;br /&gt;
&lt;br /&gt;
If you wish to get Obsidian running quickly using a database platform you already have running, follow these steps:&lt;br /&gt;
&lt;br /&gt;
# Ensure you have a JDK (11 or up for Obsidian 6.x.x and 5.x.x, 1.7 or up for Obsidian 4.x.x) installed and that the &amp;lt;code&amp;gt;JAVA_HOME&amp;lt;/code&amp;gt; environment variable is set to your JDK installation directory.&lt;br /&gt;
# Unzip the Obsidian download zip file to a directory of your choice.&lt;br /&gt;
# At the command line, in the zip extraction directory, run the [[Installation_Guide|installer]] using this command, substituting the appropriate Obsidian version number: &amp;lt;code&amp;gt;java -jar Obsidian-Install-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;.jar&amp;lt;/code&amp;gt;&lt;br /&gt;
# Start Obsidian using the command: &amp;lt;code&amp;gt;./webObsidian.sh start scheduler&amp;lt;/code&amp;gt; for Linux or &amp;lt;code&amp;gt;webObsidian.bat start scheduler&amp;lt;/code&amp;gt; for Windows.&lt;br /&gt;
# Go to http://localhost:8080 in your browser and check out your fully functional Obsidian web application and scheduler! You can log in to the admin web application with the default user &#039;&#039;admin&#039;&#039; and password &#039;&#039;changeme&#039;&#039;.&lt;br /&gt;
# When you&#039;re done, stop Obsidian using the command: &amp;lt;code&amp;gt;./webObsidian.sh stop&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;webObsidian.bat stop&amp;lt;/code&amp;gt; for Windows.&lt;br /&gt;
&lt;br /&gt;
= Initial Setup  =&lt;br /&gt;
&lt;br /&gt;
This section covers the setup required after you&#039;ve selected your [[#Choose_Your_Installation_Type|installation type]]. &lt;br /&gt;
&lt;br /&gt;
== Database ==&lt;br /&gt;
&lt;br /&gt;
Obsidian requires a database which must be created before running Obsidian. Multiple [[#Supported Platforms|database platforms]] are supported. Obsidian can share a database/schema with another application.&lt;br /&gt;
&lt;br /&gt;
Note that the database must exist before deployment, but by default Obsidian will automatically create all required tables.&lt;br /&gt;
&lt;br /&gt;
Later, you will specify database connection parameters within Obsidian&#039;s installer to tell it how to connect. If you need to configure advanced settings or change settings directly after you&#039;ve run run the installer, see [[Advanced Configuration]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Obsidian needs to create the tables in the target database. If the schema is shared with your application’s tables, please ensure there are no name conflicts. If there are conflicts, separate schemas/databases can be used, or a table prefix can be specified as shown in [[Advanced_Configuration#Database_Properties|Advanced Configuration]]. [[Obsidian Tables]] lists the tables Obsidian will created upon first deployment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Manual Schema Creation ===&lt;br /&gt;
&lt;br /&gt;
When you start Obsidian, it will automatically detect and create missing tables in your target database. However, if you wish to run Obsidian with a database user that does not have create privileges, or simply wish to prepare your database structure ahead of time, you can use the database scripts provided with your download zip file under the &amp;quot;db_scripts&amp;quot; directory.&lt;br /&gt;
&lt;br /&gt;
First create your database, and locate the &amp;quot;complete.sql&amp;quot; file under the directory for the database you are using under the &amp;quot;db_scripts&amp;quot; directory. Statements within this file contain the token &amp;quot;$px$&amp;quot; to enable table prefixes. Before you run the SQL file, replace all instances of the token &amp;quot;$px$&amp;quot; (without quotes) with a table prefix 6 characters or shorter (letters and underscores supported), or with blank.&lt;br /&gt;
&lt;br /&gt;
Then, in your SQL client of choice, execute the script and all the required Obsidian tables will be created.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Alternate Oracle Schemas ===&lt;br /&gt;
&lt;br /&gt;
After allowing Obsidian to create all the required tables and initial data by deploying it a single time, Obsidian can be run with an alternate Oracle user by specifying the target schema on Oracle databases. See [[Advanced_Configuration#Database_Properties|Advanced Configuration]] for the property to set.&lt;br /&gt;
&lt;br /&gt;
If you use a separate user from the schema owner, you must grant the user [[Obsidian_Tables#Oracle Privileges|certain privileges]] for Obsidian to function correctly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MS SQL Server Snapshot Isolation ===&lt;br /&gt;
&lt;br /&gt;
For maximum compatibility and to avoid deadlocks, MS SQL Server should be configured to use [https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/sql/snapshot-isolation-in-sql-server read committed snapshot isolation].&lt;br /&gt;
&lt;br /&gt;
This can be enabled on your database by running the following commands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER DATABASE MyDatabase SET ALLOW_SNAPSHOT_ISOLATION ON&lt;br /&gt;
ALTER DATABASE MyDatabase SET READ_COMMITTED_SNAPSHOT ON&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
&lt;br /&gt;
By default, Obsidian manages its own set users and logins to restrict access to the admin web application and REST API. A default “admin” user is created when the scheduler is first deployed and no additional setup is required.&lt;br /&gt;
&lt;br /&gt;
Alternatively, to use LDAP authentication, select the LDAP option in the installer and enter your LDAP details.&lt;br /&gt;
&lt;br /&gt;
As of 7.0.0, you can also select OAuth / OIDC authentication to enable Single Sign-On via an external identity provider. See [[Authenticator#OAuthAuthenticator_(OIDC_SSO)|OAuthAuthenticator]] for details.&lt;br /&gt;
&lt;br /&gt;
Finally, you may implement your own [[authenticator|custom authenticator]] Java class, which you also enter when running the installer.&lt;br /&gt;
&lt;br /&gt;
= Running the Installer =&lt;br /&gt;
&lt;br /&gt;
Now that you&#039;ve chosen your installation type and performed initial setup of your database and authentication, you can run Obsidian&#039;s installer to configure and build a set of artifacts that you can either use to embed Obsidian, or deploy directly.&lt;br /&gt;
&lt;br /&gt;
To run the installer, please follow our detailed [[Installation_Guide|installation guide]].&lt;br /&gt;
&lt;br /&gt;
=== Installer-Created Artifacts ===&lt;br /&gt;
&lt;br /&gt;
Once you&#039;ve run the installer, your installation directory will look something like the following, depending on which artifacts you chose to generate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
├───db_scripts&lt;br /&gt;
└───Obsidian-7.0.0&lt;br /&gt;
    │   com.carfey.yaml.reference&lt;br /&gt;
    │   obsidian.war&lt;br /&gt;
    │   obsidian-builtin-job-src.jar&lt;br /&gt;
    │   obsidianForkedJob.bat&lt;br /&gt;
    │   obsidianForkedJob.sh&lt;br /&gt;
    │   obsidian-javadoc.zip&lt;br /&gt;
    │   standaloneObsidian.bat&lt;br /&gt;
    │   standaloneObsidian.sh&lt;br /&gt;
    │   standaloneObsidianAdmin.war&lt;br /&gt;
    │   webObsidian.bat&lt;br /&gt;
    │   webObsidian.sh&lt;br /&gt;
    │&lt;br /&gt;
    ├───embed-tomcat-lib  (present when an Embedded Tomcat pack is selected)&lt;br /&gt;
    ├───license&lt;br /&gt;
    ├───logs&lt;br /&gt;
    └───standalone&lt;br /&gt;
        (various JAR files...)&lt;br /&gt;
        obsidian-yaml-configuration.jar&lt;br /&gt;
        obsidian.jar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The installer creates a top-level directory named &#039;&#039;&#039;Obsidian-n.n.n&#039;&#039;&#039; containing generated artifacts. The key files and directories are:&lt;br /&gt;
&lt;br /&gt;
; com.carfey.yaml.reference or com.carfey.properties.reference&lt;br /&gt;
: Copy of the configuration file generated by the installer.&lt;br /&gt;
; obsidian.war&lt;br /&gt;
: Combined scheduler and admin web application WAR. Deploy directly to a servlet container, or run locally using the Embedded Tomcat pack (see below). Customise by adding your job code and dependencies as JARs to &#039;&#039;&#039;/WEB-INF/lib&#039;&#039;&#039; within the archive.&lt;br /&gt;
; standaloneObsidian.bat and standaloneObsidian.sh&lt;br /&gt;
: Windows and Linux scripts to start the standalone scheduler process with no web application. Customise by adding your job code and dependencies as JARs to the &#039;&#039;&#039;standalone&#039;&#039;&#039; directory.&lt;br /&gt;
; webObsidian.bat and webObsidian.sh&lt;br /&gt;
: Windows and Linux scripts to start Obsidian using the embedded Tomcat runtime (requires the &#039;&#039;&#039;Obsidian Embedded Tomcat JAR&#039;&#039;&#039; or &#039;&#039;&#039;Obsidian Standalone Admin Embedded Tomcat JAR&#039;&#039;&#039; pack). Use &#039;&#039;&#039;start scheduler&#039;&#039;&#039; to run the combined scheduler+admin WAR, or &#039;&#039;&#039;start adminOnly&#039;&#039;&#039; to run the standalone admin WAR. Stop with &#039;&#039;&#039;stop&#039;&#039;&#039;.&lt;br /&gt;
; standaloneObsidianAdmin.war&lt;br /&gt;
: Standalone admin web application WAR (no scheduler). Deploy directly to a servlet container or run via the embedded Tomcat pack.&lt;br /&gt;
; embed-tomcat-lib&lt;br /&gt;
: Present when an Embedded Tomcat pack is selected. Contains the embedded Tomcat runtime JARs used by the &#039;&#039;&#039;webObsidian&#039;&#039;&#039; scripts.&lt;br /&gt;
; standalone&lt;br /&gt;
: Directory containing JARs required to run the standalone scheduler process. &#039;&#039;&#039;obsidian-yaml-configuration.jar&#039;&#039;&#039; or &#039;&#039;&#039;obsidian-properties-configuration.jar&#039;&#039;&#039; contains the Obsidian configuration file. To make configuration changes for the standalone scheduler, update the configuration file within this JAR.&lt;br /&gt;
&lt;br /&gt;
= Embedding Obsidian &amp;amp; Customizing Artifacts =&lt;br /&gt;
&lt;br /&gt;
The Obsidian scheduler process needs Java classpath access to your jobs so it can detect valid jobs and execute them. This requires a bit of customization before you are ready to run custom Java jobs. If you still haven&#039;t created your custom jobs, consult [[Implementing Jobs]] before proceeding. If you only intend to use [[Scripting Jobs]], customization will not be required and you can skip to [[#Deployment|Deployment]].&lt;br /&gt;
&lt;br /&gt;
If you want to embed Obsidian into your application or need to deploy jobs and their dependent libraries to the generated Obsidian artifacts, follow the steps in the appropriate sections below.&lt;br /&gt;
&lt;br /&gt;
Note that only Obsidian scheduler processes need to be customized to include your job code. The admin web application itself does not require classpath access to your jobs.&lt;br /&gt;
&lt;br /&gt;
== Embedding Obsidian - Importing Libraries and Properties File ==&lt;br /&gt;
&lt;br /&gt;
To embed Obsidian, you will need to update your application build to bring in the JAR files it requires, along with the Obsidian properties file. Simply follow these steps:&lt;br /&gt;
&lt;br /&gt;
# Import all required [[Advanced_Configuration#Dependent_Libraries|Obsidian JAR files]] into your project and reference them in your build files. &lt;br /&gt;
#* These can be obtained from the &amp;lt;code&amp;gt;standalone&amp;lt;/code&amp;gt; directory of your installation. Make sure you &#039;&#039;&#039;exclude&#039;&#039;&#039; &amp;lt;code&amp;gt;obsidian-(yaml/properties)-configuration.jar&amp;lt;/code&amp;gt;&lt;br /&gt;
#* Ensure your Maven, Gradle or Ant files are updated to include all required libraries in your build, along with your IDE.&lt;br /&gt;
# Make a copy of &amp;lt;code&amp;gt;com.carfey.yaml.reference&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;com.carfey.properties.reference&amp;lt;/code&amp;gt; from your installation with the &amp;lt;code&amp;gt;.reference&amp;lt;/code&amp;gt; suffix removed, and add it to your project&#039;s classpath.&lt;br /&gt;
#* This is typically just a matter of adding it to your project&#039;s resources directory.&lt;br /&gt;
#* From now on, you can update this file to change the various configuration options such as database connection details.&lt;br /&gt;
#* You may wish to leave this file out of source control and let developers configure their own installations. However, any running Obsidian instance will need access to a valid [[Advanced_Configuration#Properties.2FYaml_File|properties file]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Maven users:&#039;&#039;&#039; Note that we do not publish Maven artifacts for Obsidian, so you will not be able to include them by referencing a public repository.&lt;br /&gt;
&lt;br /&gt;
== Adding Custom Jobs to Standalone Scheduler ==&lt;br /&gt;
&lt;br /&gt;
In order for the standalone scheduler to detect and execute custom jobs written in Java, you will need to ensure Obsidian&#039;s classpath contains the compiled job code, along with its dependencies.&lt;br /&gt;
&lt;br /&gt;
To do so, you need to perform just one step before starting the standalone scheduler:&lt;br /&gt;
&lt;br /&gt;
# Copy JAR files containing custom Obsidian jobs and all runtime dependencies to the &amp;lt;code&amp;gt;standalone&amp;lt;/code&amp;gt; directory in your installation.&lt;br /&gt;
#* These JARs should be alongside &amp;lt;code&amp;gt;obsidian.jar&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* All JAR files in this directory will be automatically added to the classpath when run via the &amp;lt;code&amp;gt;standaloneObsidian.sh&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;standaloneObsidian.bat&amp;lt;/code&amp;gt; scripts.&lt;br /&gt;
&lt;br /&gt;
== Adding Custom Jobs to Combined Scheduler and Admin Web Application ==&lt;br /&gt;
&lt;br /&gt;
In order for the combined scheduler and admin web application to detect and execute custom jobs written in Java, you will need to ensure Obsidian&#039;s classpath contains the compiled job code, along with its dependencies.&lt;br /&gt;
&lt;br /&gt;
To do so, you need to perform just one step before deploying the Obsidian WAR file:&lt;br /&gt;
&lt;br /&gt;
# Copy JAR files containing custom Obsidian jobs and all runtime dependencies to the &amp;lt;code&amp;gt;WEB-INF/lib&amp;lt;/code&amp;gt; directory within the WAR archive.&lt;br /&gt;
#* These JARs should be alongside &amp;lt;code&amp;gt;obsidian.jar&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* WAR files use the ZIP format and can be extracted and recompressed with normal ZIP tools or the JDK &amp;lt;code&amp;gt;jar&amp;lt;/code&amp;gt; utility.&lt;br /&gt;
&lt;br /&gt;
== Updating the Properties File in Admin Web Applications ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Note that updating the WAR artifact is not necessary to perform properties file changes when using an external properties file as described [[Advanced_Configuration#Properties_File|here]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you need to change [[Advanced_Configuration#Properties_File|configuration properties]] for a standalone admin web application or combined scheduler and admin web application, follow these steps:&lt;br /&gt;
&lt;br /&gt;
# Obtain the WAR artifact from your installation that requires changes. This is either &amp;lt;code&amp;gt;obsidian.war&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;standaloneObsidianAdmin.war&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Extract the WAR file to a clean directory.&lt;br /&gt;
# Edit the &amp;lt;code&amp;gt;com.carfey.(yaml/properties)&amp;lt;/code&amp;gt; file within the subdirectory &amp;lt;code&amp;gt;WEB-INF/classes&amp;lt;/code&amp;gt; and save your changes.&lt;br /&gt;
# Rebundled the WAR artifact using a zip utility or the JDK &amp;lt;code&amp;gt;jar&amp;lt;/code&amp;gt; utility.&lt;br /&gt;
#* Some zip utilities such as 7Zip will allow you to edit files within an archive directly without the previous steps. It is generally safe to do so.&lt;br /&gt;
&lt;br /&gt;
= Deployment =&lt;br /&gt;
&lt;br /&gt;
You are now ready to deploy your scheduler and/or admin web application.&lt;br /&gt;
&lt;br /&gt;
== Embedded Scheduler ==&lt;br /&gt;
&lt;br /&gt;
When Obsidian is embedded, there is no separate deployment process. However, you will need to start and stop Obsidian with your application. If you are using Spring, we recommend you use our [[Spring Integration]] instead, which will automatically start and stop the scheduler for you.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
During your application startup, once it is fully initialized (or as close as possible), start Obsidian, and save a reference to the returned result so you can shut it down later:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// This will start the scheduler on the first call to get().&lt;br /&gt;
&lt;br /&gt;
com.carfey.ops.job.SchedulerStarter starter = com.carfey.ops.job.SchedulerStarter.get(com.carfey.ops.job.SchedulerStarter.SchedulerMode.EMBEDDED);&lt;br /&gt;
&lt;br /&gt;
// ...&lt;br /&gt;
&lt;br /&gt;
// Later, we need to gracefully shut down the scheduler &lt;br /&gt;
starter.shutDown();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will run Obsidian&#039;s scheduler process, but will not include any of the web application or the REST API. This functionality is provided by the admin web application.&lt;br /&gt;
&lt;br /&gt;
== Standalone Admin Web Application ==&lt;br /&gt;
&lt;br /&gt;
To deploy the standalone admin web application, simply deploy the &amp;lt;code&amp;gt;standaloneObsidianAdmin.war&amp;lt;/code&amp;gt; file your servlet container of choice (e.g. Tomcat) after configuring it appropriately. You may rename the WAR file to have it deployed under a different context path, if desired (e.g. &amp;quot;ROOT.war&amp;quot; or &amp;quot;obsidian.war&amp;quot;). Consult your servlet documentation to find out how to deploy the application and start the servlet container.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; If you want to use the included Jetty server as your servlet container, you can use the scripts included in your installation instead of deploying the WAR. This will make the application accessible at http://localhost:8080.&lt;br /&gt;
* To start &lt;br /&gt;
** Linux: &amp;lt;code&amp;gt;./webObsidian.sh start adminOnly&amp;lt;/code&amp;gt;&lt;br /&gt;
** Windows: &amp;lt;code&amp;gt;webObsidian.bat start adminOnly&amp;lt;/code&amp;gt;&lt;br /&gt;
* To stop&lt;br /&gt;
** Linux: &amp;lt;code&amp;gt;./webObsidian.sh stop&amp;lt;/code&amp;gt; &lt;br /&gt;
** Windows: &amp;lt;code&amp;gt;webObsidian.bat stop&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Security Note:&#039;&#039;&#039; By default, the admin web application allows non-secure connections. If you wish to force secure connections through HTTPS, you can edit the web.xml in your war and uncomment the &amp;lt;security-constraint&amp;gt; element in the file. This will force all requests to redirect to an encrypted connection. For details on setting up SSL on your servlet container, refer to its documentation.&lt;br /&gt;
&lt;br /&gt;
== Standalone Scheduler ==&lt;br /&gt;
&lt;br /&gt;
To deploy and run the standalone scheduler, you may use the provided scripts in your installation directory:&lt;br /&gt;
* Linux: &amp;lt;code&amp;gt;./standaloneObsidian.sh start&amp;lt;/code&amp;gt;&lt;br /&gt;
* Windows: &amp;lt;code&amp;gt;standaloneObsidian.bat start&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You should always stop Obsidian gracefully when possible by using:&lt;br /&gt;
* Linux: &amp;lt;code&amp;gt;./standaloneObsidian.sh stop&amp;lt;/code&amp;gt;&lt;br /&gt;
* Windows: &amp;lt;code&amp;gt;standaloneObsidian.bat stop&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Both the start and stop commands may be supplied an additional argument to override the &amp;lt;code&amp;gt;listenerPort&amp;lt;/code&amp;gt; which defaults to 10451.&lt;br /&gt;
&lt;br /&gt;
Rather than use one of the provided scripts, you can invoke the equivalent Java command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java com.carfey.ops.job.SchedulerStarter start &amp;lt;listenerPort&amp;gt;&lt;br /&gt;
java com.carfey.ops.job.SchedulerStarter stop &amp;lt;listenerPort&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Combined Scheduler and Admin Web Application ==&lt;br /&gt;
&lt;br /&gt;
To deploy the combined scheduler and admin web application, simply deploy the &amp;lt;code&amp;gt;obsidian.war&amp;lt;/code&amp;gt; file your servlet container of choice (e.g. Tomcat) after configuring it appropriately. You may rename the WAR file to have it deployed under a different context path, if desired (e.g. &amp;quot;ROOT.war&amp;quot;). Consult your servlet documentation to find out how to deploy the application and start the servlet container.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; If you want to use the included Jetty server as your servlet container, you can use the scripts included in your installation instead of deploying the WAR.  This will make the web application accessible at the URL http://localhost:8080.&lt;br /&gt;
&lt;br /&gt;
* To start &lt;br /&gt;
** Linux: &amp;lt;code&amp;gt;./webObsidian.sh start scheduler&amp;lt;/code&amp;gt;&lt;br /&gt;
** Windows: &amp;lt;code&amp;gt;webObsidian.bat start scheduler&amp;lt;/code&amp;gt;&lt;br /&gt;
* To stop&lt;br /&gt;
** Linux: &amp;lt;code&amp;gt;./webObsidian.sh stop&amp;lt;/code&amp;gt; &lt;br /&gt;
** Windows: &amp;lt;code&amp;gt;webObsidian.bat stop&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Security Note:&#039;&#039;&#039; By default, the admin web application allows non-secure connections. If you wish to force secure connections through HTTPS, you can edit the web.xml in your war and uncomment the &amp;lt;security-constraint&amp;gt; element in the file. This will force all requests to redirect to an encrypted connection. For details on setting up SSL on your servlet container, refer to its documentation.&lt;br /&gt;
&lt;br /&gt;
== Embedding the Obsidian Web Application in Another Web Application ==&lt;br /&gt;
&lt;br /&gt;
We do not generally recommend attempting to merge the Obsidian admin web application with another servlet web application, but it can be done by following these steps:&lt;br /&gt;
&lt;br /&gt;
To embed the full Obsidian web application in an existing web application, you will need to extract the necessary sections from the &amp;lt;code&amp;gt;WEB-INF/web.xml&amp;lt;/code&amp;gt; file in the &amp;lt;code&amp;gt;obsidian.war&amp;lt;/code&amp;gt; file and merge them into your application&#039;s &amp;lt;code&amp;gt;web.xml&amp;lt;/code&amp;gt; file. This includes all &amp;quot;listener&amp;quot;, &amp;quot;servlet&amp;quot;, &amp;quot;servlet-mapping&amp;quot;, &amp;quot;jsp-config&amp;quot;, &amp;quot;filter&amp;quot;, &amp;quot;filter-mapping&amp;quot; elements, and optionally &amp;quot;welcome-file-list&amp;quot; and &amp;quot;error-page&amp;quot; elements. Ensure that all servlet paths are maintained. If you are using a different servlet specification version, you may need to update the mappings to the appropriate format.&lt;br /&gt;
&lt;br /&gt;
Note the use of our &amp;lt;code&amp;gt;com.carfey.ops.servlet.StartupShutdownListener&amp;lt;/code&amp;gt; which takes care of starting up the scheduler instance and using the web container&#039;s default shutdown mechanism to ensure graceful shutdown. This listener will start Obsidian&#039;s scheduler process and initialize the Obsidian web application. &lt;br /&gt;
&lt;br /&gt;
If you wish to embed Obsidian&#039;s web application without the scheduler running, include the following parameter element in your &amp;lt;code&amp;gt;web.xml&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;context-param&amp;gt;&lt;br /&gt;
   &amp;lt;param-name&amp;gt;schedulerEnabled&amp;lt;/param-name&amp;gt;&lt;br /&gt;
   &amp;lt;param-value&amp;gt;false&amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Additional Deployment Details ==&lt;br /&gt;
&lt;br /&gt;
=== Classpath Notes ===&lt;br /&gt;
&lt;br /&gt;
To run a scheduler with your custom code and jobs, you need to ensure the scheduler process classpath includes your code packaged into JAR files, as described [[#Embedding_Obsidian_.26_Customizing_Artifacts|above]]. &lt;br /&gt;
&lt;br /&gt;
If a compiled job is updated, you will have to restart your application or the servlet container after deploying updated jars, unless you are using [[Job Forking]].&lt;br /&gt;
&lt;br /&gt;
=== Setting Host Names ===&lt;br /&gt;
Obsidian instances will automatically assign themselves host names if no host name is explicitly set, but you may wish to give them explicit names to make scheduling and monitoring simpler.&lt;br /&gt;
&lt;br /&gt;
If you wish to assign explicit names, simply set the Java system property &amp;lt;code&amp;gt;schedulerDesignation&amp;lt;/code&amp;gt; to the host name of your choice. For example, if starting an instance using the standalone scheduler using &amp;lt;code&amp;gt;java&amp;lt;/code&amp;gt; directly, simply add the value &amp;lt;code&amp;gt;-DschedulerDesignation=myHostName&amp;lt;/code&amp;gt; to the end of the command.&lt;br /&gt;
&lt;br /&gt;
You may also use a properties file setting for the host name as detailed in [[Advanced Configuration]].&lt;br /&gt;
&lt;br /&gt;
=== Disabling Automatic Database Updates ===&lt;br /&gt;
&lt;br /&gt;
Obsidian automatically applies schema updates and data upgrades to its database on startup. In some cases, it may be desirable to disable this once the database has been fully initialized and upgrades to new versions are not going to be deployed. For example, you may wish to run Obsidian with a user who does not have privileges to modify the database schema.&lt;br /&gt;
&lt;br /&gt;
To do so, you can either set a Java system property, or if you are using the admin web application WAR, you can add a setting to your &amp;lt;code&amp;gt;WEB-INF/web.xml&amp;lt;/code&amp;gt; within the archive.&lt;br /&gt;
&lt;br /&gt;
As a system property:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-DstartupRunnerClass=com.carfey.ops.run.NullRunner&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In &amp;lt;code&amp;gt;WEB-INF/web.xml&amp;lt;/code&amp;gt;, after any &amp;lt;code&amp;gt;listener&amp;lt;/code&amp;gt; elements:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;context-param&amp;gt;&lt;br /&gt;
    &amp;lt;param-name&amp;gt;startupRunnerClass&amp;lt;/param-name&amp;gt;&lt;br /&gt;
    &amp;lt;param-value&amp;gt;com.carfey.ops.run.NullRunner&amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Disabling DDL Updates ===&lt;br /&gt;
&lt;br /&gt;
It may also be helpful to apply schema updates (DDL) outside Obsidian through a privileged account, but allow Obsidian upgrades to make the necessary data initialization/modifications. This can be done using a &#039;&#039;&#039;skipDDL&#039;&#039;&#039; configuration property documented under [[Advanced_Configuration#Miscellaneous_Properties | Advanced Configuration]].&lt;br /&gt;
&lt;br /&gt;
=== Disabling Job Scheduling in the Web Application ===&lt;br /&gt;
&lt;br /&gt;
If you have combined scheduler and admin web application WAR already built, you can easily tweak it to disable the scheduler process. &lt;br /&gt;
&lt;br /&gt;
Simply add the following to your &amp;lt;code&amp;gt;WEB-INF/web.xml&amp;lt;/code&amp;gt; within the WAR archive after any &amp;lt;code&amp;gt;listener&amp;lt;/code&amp;gt; elements:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;context-param&amp;gt;&lt;br /&gt;
    &amp;lt;param-name&amp;gt;schedulerEnabled&amp;lt;/param-name&amp;gt;&lt;br /&gt;
    &amp;lt;param-value&amp;gt;false&amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= You’re Good to Go! =&lt;br /&gt;
&lt;br /&gt;
You&#039;re now ready to log into the web application and start scheduling jobs! The URL you use to access Obsidian will depend on how it&#039;s been deployed, but will typically be something like http://localhost/obsidian, or http://localhost/standadminObsidianAdmin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Default User:&#039;&#039;&#039; Each Obsidian installation using native authentication starts with a single default user named &#039;&#039;admin&#039;&#039; with password &#039;&#039;changeme&#039;&#039;. You should change this after your first log in. See [[Admin_User_Management|User Management]] for how to change a user&#039;s password.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
At this point we suggest you play around with the admin web application. Many screens offer inline help. Otherwise, you can refer to our [[Admin Web Application Guide]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To get started writing jobs that you can run in Obsidian, see [[Implementing_Jobs|Implementing Jobs]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
See the &#039;&#039;&#039;[[User Guide]]&#039;&#039;&#039; if you have questions or wish to explore what Obsidian offers.&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Installation_Guide&amp;diff=4087</id>
		<title>Installation Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Installation_Guide&amp;diff=4087"/>
		<updated>2026-07-09T20:35:48Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;This installation guide generally applies to Obsidian versions 4.0 and newer but is specific to 6.0. You may see a few minor differences in 4.x and 5.x releases. See the [[Installation_Guide_(3.x.x_and_earlier)|Installation Guide]] for all prior versions.&lt;br /&gt;
&lt;br /&gt;
This installation guide is a companion to the Obsidian Installer UI. Its purpose is to provide additional detail as to the meaning of various inputs and to provide guidance on advanced usage of the installer.&lt;br /&gt;
&lt;br /&gt;
The installer itself installs and configures the artifacts. The configured artifacts will have their [[Advanced_Configuration#Properties_File|Properties]] file configured according to the choices made during the installation process. You may always change these later or use one of the [[Advanced_Configuration#Properties_File|override]] mechanisms.&lt;br /&gt;
== Running the Obsidian Installer ==&lt;br /&gt;
The installer is an executable JAR file in the Obsidian download zip package available on our [https://web.obsidianscheduler.com/download/ download page].&lt;br /&gt;
&lt;br /&gt;
The installer can be run from the command line as a graphical user interface using &amp;lt;code&amp;gt;java -jar Obsidian-Install-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;.jar&amp;lt;/code&amp;gt; or in interactive console mode using &amp;lt;code&amp;gt;java -jar Obsidian-Install-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;.jar -console&amp;lt;/code&amp;gt;. Note that you will have to replace the JAR file name with the actual versioned name in your installation.&lt;br /&gt;
&lt;br /&gt;
On some platforms, simple double-clicking the JAR file will start it in graphical interface mode.&lt;br /&gt;
&lt;br /&gt;
If you are doing a version upgrade of Obsidian or are otherwise uninterested in actually configuring the artifacts, you can run the quick start mode to get the default configured artifacts using &amp;lt;code&amp;gt;java -jar Obsidian-Install-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;.jar h2-winstone-quick-start.xml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Obsidian Installer Artifacts ==&lt;br /&gt;
&lt;br /&gt;
The Obsidian Installer installs and configures a number of artifacts. You can choose which artifacts to create, but most users can leave the default options selected.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Artifacts.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Obsidian WAR&#039;&#039;&#039; - This is the Obsidian Web Admin UI with scheduler component enabled. Configuration will be found at &#039;&#039;INSTALL_PATH&#039;&#039;/obsidian.war!/WEB-INF/classes/com.carfey.properties.&lt;br /&gt;
# &#039;&#039;&#039;Obsidian Standalone Admin WAR&#039;&#039;&#039; - This is the Obsidian Web Admin UI with scheduler component disabled. Configuration will be found at &#039;&#039;INSTALL_PATH&#039;&#039;/standaloneObsidianAdmin.war!/WEB-INF/classes/com.carfey.properties.&lt;br /&gt;
# &#039;&#039;&#039;Standalone Obsidian Runtime&#039;&#039;&#039; - This is a runtime folder containing the libraries and configuration necessary for running the Obsidian Scheduler component either as a standalone module or for use as an Embedded Scheduler in your application. Configuration will be found at &#039;&#039;INSTALL_PATH&#039;&#039;/standalone/obsidian-props.jar!/com.carfey.properties.&lt;br /&gt;
# &#039;&#039;&#039;Obsidian License Proxy&#039;&#039;&#039; - Allows for local license leasing from a [[Key_Server_Proxy|Key Server Proxy]] that ultimately leases licenses from the Obsidian License server.&lt;br /&gt;
# &#039;&#039;&#039;Documentation&#039;&#039;&#039; - README and Embedded API Javadoc.&lt;br /&gt;
# &#039;&#039;&#039;Jetty&#039;&#039;&#039; - A simple servlet container for quick evaluation of the Obsidian UI.&lt;br /&gt;
# &#039;&#039;&#039;License&#039;&#039;&#039; - Obsidian and 3rd party license information.&lt;br /&gt;
&lt;br /&gt;
==== Deployment options ====&lt;br /&gt;
&lt;br /&gt;
Obsidian 7.0.0 offers four deployment profiles in the installer:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Obsidian WAR&#039;&#039;&#039; — deploy &#039;&#039;&#039;obsidian.war&#039;&#039;&#039; to your own servlet container (Tomcat, WebLogic, etc.).&lt;br /&gt;
* &#039;&#039;&#039;Obsidian Embedded Tomcat JAR&#039;&#039;&#039; — adds an embedded Tomcat runtime and &#039;&#039;&#039;webObsidian&#039;&#039;&#039; scripts to run &#039;&#039;&#039;obsidian.war&#039;&#039;&#039; locally (&#039;&#039;&#039;start scheduler&#039;&#039;&#039;). &#039;&#039;&#039;Requires&#039;&#039;&#039; the Obsidian WAR pack.&lt;br /&gt;
* &#039;&#039;&#039;Obsidian Standalone Admin WAR&#039;&#039;&#039; — admin console WAR for an external servlet container.&lt;br /&gt;
* &#039;&#039;&#039;Obsidian Standalone Admin Embedded Tomcat JAR&#039;&#039;&#039; — embedded runtime for the admin WAR (&#039;&#039;&#039;start adminOnly&#039;&#039;&#039;). &#039;&#039;&#039;Requires&#039;&#039;&#039; the Standalone Admin WAR pack.&lt;br /&gt;
&lt;br /&gt;
Embedded Tomcat does &#039;&#039;&#039;not&#039;&#039;&#039; replace the WAR on disk — it runs the installed WAR via the helper. Do not select an embed pack without its matching WAR pack.&lt;br /&gt;
&lt;br /&gt;
== Obsidian Configuration ==&lt;br /&gt;
&lt;br /&gt;
The installer will guide you through the configuration Obsidian.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Configuring-Obsidian-6.0.0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
First, you must choose what [[Authenticator]] mechanism will be used within Obsidian. &#039;&#039;Native (Database)&#039;&#039; authentication requires no additional configuration and is what most users will select. Select &#039;&#039;Other&#039;&#039; if you have implemented your own authentication mechanism, OAuth (OIDC) to configure OAuth or SAML ,&#039;LDAP&#039;&#039; to configure LDAP settings. &lt;br /&gt;
&lt;br /&gt;
Next, you&#039;ll want to select the email usage type. We highly recommend you configure Obsidian for email use as it will allow you to benefit from the event [[Event_Notifications|notification]] and [[Admin_Notifications|subscription]] support in Obsidian.&lt;br /&gt;
&lt;br /&gt;
Then you&#039;ll configure the log file location, license key (optional) and registered company name (optional). Registered company name is only required for our Site License users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== OAuth / OIDC Configuration ====&lt;br /&gt;
&lt;br /&gt;
If you selected &#039;&#039;&#039;OAuth (OIDC)&#039;&#039;&#039; as the authentication type, the installer displays additional panels for OAuth configuration.&lt;br /&gt;
&lt;br /&gt;
===== Panel: Provider and Common Settings =====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Identity Provider&#039;&#039;&#039; — Select your provider: Keycloak, Microsoft Entra ID, Okta, Auth0, or Generic OIDC.&lt;br /&gt;
* &#039;&#039;&#039;Display name&#039;&#039;&#039; — Label shown on the &amp;quot;Sign in with…&amp;quot; button (e.g. &#039;&#039;Keycloak&#039;&#039;, &#039;&#039;Acme Corp SSO&#039;&#039;). If left blank the button reads &amp;quot;Sign in with SSO&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Redirect URI&#039;&#039;&#039; — The callback URL Obsidian receives after IdP login. Must be registered at the IdP (e.g. &#039;&#039;https://app.example.com/oauth/callback&#039;&#039;).&lt;br /&gt;
* &#039;&#039;&#039;Logout mode&#039;&#039;&#039; — &#039;&#039;local&#039;&#039; (default) or &#039;&#039;rp&#039;&#039; (RP-initiated logout via the IdP&#039;s end_session_endpoint).&lt;br /&gt;
&lt;br /&gt;
===== Panel: Provider-Specific Settings =====&lt;br /&gt;
&lt;br /&gt;
Fill in the connection details for your chosen provider.&lt;br /&gt;
&lt;br /&gt;
;Keycloak&lt;br /&gt;
: &#039;&#039;&#039;Issuer URL&#039;&#039;&#039; — e.g. &#039;&#039;https://keycloak.example.com/realms/myrealm&#039;&#039;. &#039;&#039;&#039;Client ID&#039;&#039;&#039; and &#039;&#039;&#039;Client Secret&#039;&#039;&#039; from the Keycloak client settings. &#039;&#039;&#039;Scopes&#039;&#039;&#039; — recommended: &#039;&#039;openid profile email groups&#039;&#039;. Note: Keycloak does not include a &#039;&#039;groups&#039;&#039; claim by default — a Group Membership mapper must be configured in the client&#039;s Mappers tab.&lt;br /&gt;
&lt;br /&gt;
;Microsoft Entra ID&lt;br /&gt;
: &#039;&#039;&#039;Issuer URL&#039;&#039;&#039; — &#039;&#039;https://login.microsoftonline.com/&amp;lt;tenant-id&amp;gt;/v2.0&#039;&#039;. &#039;&#039;&#039;Client ID&#039;&#039;&#039; — the Application (client) ID from the Azure portal. &#039;&#039;&#039;Client Secret&#039;&#039;&#039; — a client secret value from the Azure portal. &#039;&#039;&#039;Scopes&#039;&#039;&#039; — &#039;&#039;openid profile email&#039;&#039;. Note: the &#039;&#039;groups&#039;&#039; claim contains GUIDs by default; configure Optional Claims in the Azure portal to receive group display names. &#039;&#039;&#039;Multi-tenant applications are not supported in Obsidian 7.0.0.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
;Okta&lt;br /&gt;
: &#039;&#039;&#039;Issuer URL&#039;&#039;&#039; — use the &#039;&#039;&#039;Custom Authorization Server&#039;&#039;&#039; URL, e.g. &#039;&#039;https://&amp;lt;domain&amp;gt;.okta.com/oauth2/default&#039;&#039;. Do &#039;&#039;&#039;not&#039;&#039;&#039; use the Org Authorization Server URL. &#039;&#039;&#039;Client ID&#039;&#039;&#039; and &#039;&#039;&#039;Client Secret&#039;&#039;&#039; from Okta application settings. &#039;&#039;&#039;Scopes&#039;&#039;&#039; — &#039;&#039;openid profile email groups&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
;Auth0&lt;br /&gt;
: &#039;&#039;&#039;Domain / Issuer URL&#039;&#039;&#039; — e.g. &#039;&#039;https://&amp;lt;domain&amp;gt;.auth0.com/&#039;&#039;. &#039;&#039;&#039;Client ID&#039;&#039;&#039; and &#039;&#039;&#039;Client Secret&#039;&#039;&#039; from Auth0 application settings. &#039;&#039;&#039;Scopes&#039;&#039;&#039; — &#039;&#039;openid profile email&#039;&#039;. &#039;&#039;&#039;Important:&#039;&#039;&#039; Auth0 issues opaque access tokens by default which are &#039;&#039;&#039;not supported&#039;&#039;&#039; on Obsidian&#039;s REST/Bearer path — configure a custom API in Auth0 to get JWT access tokens.&lt;br /&gt;
&lt;br /&gt;
;Generic OIDC&lt;br /&gt;
: &#039;&#039;&#039;Issuer URL&#039;&#039;&#039; — the base URL; Obsidian appends &#039;&#039;/.well-known/openid-configuration&#039;&#039; to discover endpoints. &#039;&#039;&#039;Client ID&#039;&#039;&#039; and &#039;&#039;&#039;Client Secret&#039;&#039;&#039; from the provider. &#039;&#039;&#039;Scopes&#039;&#039;&#039; — at minimum &#039;&#039;openid&#039;&#039;; add &#039;&#039;profile&#039;&#039; and your groups scope as needed.&lt;br /&gt;
&lt;br /&gt;
===== Panel: Group → Role Mapping =====&lt;br /&gt;
&lt;br /&gt;
The final OAuth panel maps IdP group values to Obsidian roles. &#039;&#039;&#039;Require role assignment&#039;&#039;&#039; (default yes) — when enabled, users with no matching roles cannot complete browser login. At least one mapping to the &#039;&#039;&#039;Admin&#039;&#039;&#039; role is required. The installer supports up to 10 group→role pairs; additional pairs can be added directly to the configuration file after install. See [[Advanced_Configuration#OAuth_/_OIDC_Authentication_Properties]] for the full property reference.&lt;br /&gt;
&lt;br /&gt;
===== Registering the redirect URI at the IdP =====&lt;br /&gt;
&lt;br /&gt;
Before starting Obsidian, register the redirect URI shown in the installer at your IdP: Keycloak — Client → Settings → Valid Redirect URIs; Entra ID — App Registration → Authentication → Redirect URIs; Okta — Application → General Settings → Sign-in Redirect URIs; Auth0 — Application → Settings → Allowed Callback URLs. The URI must match &#039;&#039;com.carfey.suite.security.OAuthAuthenticator.redirectUri&#039;&#039; exactly, including scheme and port.&lt;br /&gt;
&lt;br /&gt;
==== LDAP Configuration ====&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Configure.LDAP.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you&#039;ve selected LDAP Authentication, this screen takes you through configuring the server address and the various elements used to grant access. You should familiarize yourself with Obsidian [[Authenticator#Roles|Roles]]. The &#039;&#039;Access DN&#039;&#039; configuration element grants Read access to Obsidian application. You may use the same DN for more than one Role should you so wish.&lt;br /&gt;
&lt;br /&gt;
==== Custom Authenticator Configuration====&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Configure.CustomAuthenticator.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you have chosen to use your own authentication mechanism, you must enter the fully qualified classname here.&lt;br /&gt;
&lt;br /&gt;
==== Database Configuration ====&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Database.Configuration.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next comes database configuration. If you are using JNDI, leave the username and password fields blank. If using JDBC URL, username and password fields are required.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;Database connections per instance&#039;&#039; and &#039;&#039;Database connection timeout(millis)&#039;&#039; fields are required and provide directive to the connection pool.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Database table name prefix&#039;&#039; is optional and is typically used when Obsidian will be colocated in an existing database/schema.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Database schema (Oracle/PostgreSQL)&#039;&#039; - This is used to allow for an alternate schema other than the default user&#039;s schema. We also recommend setting this value with Oracle/PostgreSQL when using JNDI as it allows more efficient database metadata loading.&lt;br /&gt;
&lt;br /&gt;
By default, the Obsidian installation will only include the JDBC libraries necessary for your particular database. At times you may wish to include the others to be able to change between databases. In those cases, check &#039;&#039;Include all supported JDBC libs&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Email Configuration ====&lt;br /&gt;
&lt;br /&gt;
If not using JNDI for mail sessions, provide the server and authentication details as required.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Configure.SSL.Email.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Configure.TLS.Email.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Configure.Open.Email.png]]&lt;br /&gt;
&lt;br /&gt;
==== JNDI Configuration ====&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Configure.JNDI.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you have selected JNDI for mail sessions, provide the JNDI path here. If you are using JNDI for Database connections, specify the database type.&lt;br /&gt;
&lt;br /&gt;
==== Configuring 3rd Party Library Conflict Management ====&lt;br /&gt;
[[Image:JarJar-Obsidian-6.0.0.png]]&lt;br /&gt;
&lt;br /&gt;
The Obsidian installer allows you to use [https://code.google.com/archive/p/jarjar JarJar] to handle potential conflicts between Obsidian&#039;s use of 3rd party libraries and versions used within your application. On this screen, simply select which libraries to which you wish to apply the JarJar bytecode modification process. This is optional and is skipped if no libraries are selected. Any jars not listed for which you are using more recent versions can be used and are therefore not included as options in the JarJar processing.&lt;br /&gt;
&lt;br /&gt;
==== Selecting Script Libraries ====&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-6.0.0-Choose-Scripting-Libraries.png]]&lt;br /&gt;
&lt;br /&gt;
The Obsidian installer allows you to select which script libraries you wish to include. Jython and JRuby are incompatible with each other, so the installer will only allow one of the two selected. If all script libraries are deselected, the only script jobs that can be run in Obsidian will be Javascript jobs as that engine is built into Java.&lt;br /&gt;
&lt;br /&gt;
==== Choosing Email Support ====&lt;br /&gt;
As of Obsidian 5.2.0, you can choose between JavaMail (javax) and Jakarta mail (Jakarta EE) implementations. When choosing Jakarta, you can also choose to bundle the Angus Jakarta compatible implementation. &lt;br /&gt;
&lt;br /&gt;
If you are using JNDI, this will only include the relevant support in the Obsidian WAR artifacts and the actual libraries in use must be provided by you and bundled with your container. If the standalone scheduler is selected along with JNDI, JNDI is assumed only relevant for WARs. As such, default libraries for either JavaMail or Jakarta will be included in the standalone installation.&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.EmailImplementation.Configuration.png]]&lt;br /&gt;
&lt;br /&gt;
==== Additional configuration items ====&lt;br /&gt;
&lt;br /&gt;
As of Obsidian 5.5.0, if you require any additional configuration items such as additional appenders/loggers or event hook configurations, you can add them here.&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.5.0.Extra.Configuration.png]]&lt;br /&gt;
&lt;br /&gt;
==== Offline or restricted-network install ====&lt;br /&gt;
&lt;br /&gt;
Obsidian 7.0.0 resolves third-party libraries when you run the installer. For environments without direct access to Maven Central:&lt;br /&gt;
&lt;br /&gt;
# Pre-stage a local dependency cache containing every coordinate listed in the Obsidian dependency inventory for your release (contact Carfey support or your account team for the checklist file matching &#039;&#039;&#039;Obsidian-Install-7.0.0.jar&#039;&#039;&#039;).&lt;br /&gt;
# Copy the cache to the install host. Two layouts are supported:&lt;br /&gt;
#* &#039;&#039;&#039;Flat:&#039;&#039;&#039; one file per installed JAR name directly under the cache root.&lt;br /&gt;
#* &#039;&#039;&#039;File Maven repo:&#039;&#039;&#039; &#039;&#039;&#039;&amp;lt;group&amp;gt;/&amp;lt;artifact&amp;gt;/&amp;lt;version&amp;gt;/&amp;lt;installed-filename&amp;gt;.jar&#039;&#039;&#039;&lt;br /&gt;
# Run the installer with offline mode and the cache directory:&lt;br /&gt;
&lt;br /&gt;
 java -Dobsidian.install.deps.offline=true -Dobsidian.install.deps.cache.dir=/path/to/cache -jar Obsidian-Install-7.0.0.jar&lt;br /&gt;
&lt;br /&gt;
If a required library is missing from the cache, the install stops with an error naming the coordinate — add that artifact to the cache and re-run.&lt;br /&gt;
&lt;br /&gt;
===== Corporate Maven mirror (online) =====&lt;br /&gt;
&lt;br /&gt;
When your site mirrors Maven Central, point the installer at your repository base URL:&lt;br /&gt;
&lt;br /&gt;
 java -Dobsidian.install.deps.repo.url=https://nexus.example.com/repository/maven-public/ -jar Obsidian-Install-7.0.0.jar&lt;br /&gt;
&lt;br /&gt;
The installer reuses resolved artifacts for the duration of one install session.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Completing the Installation ==&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Finished.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Once you&#039;ve completed the Installation and Configuration screens, fully configured Obsidian Scheduler artifacts are now ready for you to use in the installation path you selected.&lt;br /&gt;
&lt;br /&gt;
Should you wish to automate future installations with the same configuration, click &#039;&#039;Generate an automatic installation script&#039;&#039;. This will prompt you to save an XML file that can be used for future installations using the automated install procedure &amp;lt;code&amp;gt;java -jar Obsidian-Install-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;.jar my-obsidian-configuration.xml&amp;lt;/code&amp;gt;. Every effort is made to ensure compatibility of these automated install files between versions. Any incompatibility will be noted in the [[Release_Notes|Release Notes]]. These automated installer files can also be used as templates for other environments, modifying them as necessary.&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Getting_Started&amp;diff=4086</id>
		<title>Getting Started</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Getting_Started&amp;diff=4086"/>
		<updated>2026-07-09T20:29:33Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This Getting Started is for Obsidian 4.0 and newer versions. See the [[Getting_Started_(3.x.x_and_earlier)|Previous Getting Started]] for prior versions.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This guide will help you choose a deployment setup that works for you, and then get it running. Before reading this page, you may wish to review Obsidian&#039;s [[Deployment Models]] to understand the different parts of Obsidian or to find out what deployment model works for you.&lt;br /&gt;
&lt;br /&gt;
If you&#039;ve are looking to start writing your own Obsidian jobs, see [[Implementing Jobs]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Supported Platforms =&lt;br /&gt;
&lt;br /&gt;
Please quickly review our supported platforms before continuing.&lt;br /&gt;
&lt;br /&gt;
* Obsidian is OS-independent, and runs on the Java Virtual Machine. It works in a variety of environments, including Linux, OSX and Windows, and can be run inside virtual machines.&lt;br /&gt;
* Obsidian 5.x.x and 6.x.x run on Java 11 or above (Obsidian 4.x.x runs on Java 1.7 or above)&lt;br /&gt;
* Obsidian&#039;s administration web application is a servlet application.&lt;br /&gt;
** 7.x.x has been tested on Tomcat 10.x&lt;br /&gt;
** 6.x.x has been tested on Tomcat 10.x and Jetty 11.x (Jakarta Servlet 5.0)&lt;br /&gt;
** 5.x.x has been tested on Tomcat 9.x and Jetty 10.x (Javax Servlet 4.0)&lt;br /&gt;
** 4.x.x has been tested on Tomcat 7, 8 &amp;amp; 8.5 and Jetty 9.x (Javax Servlet 4.0)&lt;br /&gt;
* It works on all modern browsers and is tested on recent versions of Chrome, Edge and Firefox.&lt;br /&gt;
* Obsidian requires one of the following fully-supported database platforms:&lt;br /&gt;
** MySQL 8.0.x (Obsidian 5.x and higher), 5.5-5.7 (excluding Galera)&lt;br /&gt;
** MariaDB 5.5&lt;br /&gt;
** Oracle 18c, 19c, 21c on Obsidian 5.x and higher&lt;br /&gt;
** Oracle 10g, 11.x, 12c on versions prior to Obsidian 5.0.0&lt;br /&gt;
** PostgreSQL 11-16 on Obsidian 5.x and higher&lt;br /&gt;
** PostgreSQL 9, 10&lt;br /&gt;
** MS SQL Server 2008-2019&lt;br /&gt;
** H2 1.4. &lt;br /&gt;
** &#039;&#039;Larger major versions are likely to work without issues but are not officially supported.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; With some exceptions, clustered scheduler instances require access to contact license servers over the Internet, or access to an internal proxy license server. See [[Licenses &amp;amp; Nodes]] for more information.&lt;br /&gt;
&lt;br /&gt;
== Hardware Requirements ==&lt;br /&gt;
&lt;br /&gt;
We recommend the following minimum hardware for typical installations:&lt;br /&gt;
&lt;br /&gt;
* 1 GHz processor&lt;br /&gt;
* 2 GB RAM&lt;br /&gt;
* 1 GB hard disk space (excluding accumulated logs)&lt;br /&gt;
&lt;br /&gt;
Note that actual requirements may vary depending on job volume, clustering and other factors.&lt;br /&gt;
&lt;br /&gt;
= Choose Your Installation Type =&lt;br /&gt;
&lt;br /&gt;
Obsidian consists of two main processes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scheduler&#039;&#039;&#039; - schedules and executes jobs, sends notifications, etc. Also exposes the [[Embedded API]].&lt;br /&gt;
* &#039;&#039;&#039;Admin Web Application&#039;&#039;&#039; - provides management and monitoring UI, plus the [[REST API]] and [[Embedded API]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These can be run together or separately in the following configurations. You will pick one or more of these options together to provide both the scheduler and admin web application functionality.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Standalone Scheduler&#039;&#039;&#039; - A Java process that performs job execution. A standalone scheduler installation is generated when you run the Obsidian installer, and may be customized by adding JAR files containing your job code. It is started and stopped by scripts included with the installation. Requires a separate admin web application to be deployed.&lt;br /&gt;
# &#039;&#039;&#039;Embedded Scheduler&#039;&#039;&#039; - Provides job execution like a standalone scheduler, but instead runs as a process embedded within and started from your application. This eliminates the need to customize and deploy a separate artifact which will perform job execution. Requires a separate admin web application to be deployed.&lt;br /&gt;
# &#039;&#039;&#039;Standalone Admin Web Application&#039;&#039;&#039; - A Java servlet application providing Obsidian&#039;s administration capabilities but no scheduling services.  A standalone admin application WAR file is generated when you run the Obsidian installer, and may be customized by adding JAR files containing your job code.  Requires a separate standalone, embedded or combined scheduler and web application to be deployed for job execution to be performed.&lt;br /&gt;
# &#039;&#039;&#039;Combined Scheduler and Admin Web Application&#039;&#039;&#039; - A version of the admin web application which also runs a scheduler service for job execution. A combined scheduler and admin application WAR file is generated when you run the Obsidian installer, and may be customized by adding JAR files containing your job code. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Regardless of the deployment configuration, any time you run more than one scheduler process operating against the same Obsidian database, they will automatically form a cluster and share in job execution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Choosing which installation type works best for you depends on your specific needs. The setups which are suitable for most cases are, in order: &lt;br /&gt;
&lt;br /&gt;
* Using an &#039;&#039;&#039;Embedded Scheduler&#039;&#039;&#039; (option 2), along with a &#039;&#039;&#039;Standalone Admin Web Application&#039;&#039;&#039; (option 3). This approach lets you embed Obsidian into your existing application without having to alter the Obsidian artifacts to include your job code. Instead, Obsidian&#039;s required libraries are included in your application and they are deployed together.&lt;br /&gt;
* Using a  &#039;&#039;&#039;Combined Scheduler and Admin Web Application&#039;&#039;&#039; (option 4) alone or in a cluster. This is suitable if you don&#039;t have another application containing job code for Obsidian to execute, or if you simply want to use Obsidian&#039;s scripting support, which doesn&#039;t require deploying JAR files.&lt;br /&gt;
&lt;br /&gt;
= Downloading Obsidian =&lt;br /&gt;
Just go to our [https://web.obsidianscheduler.com/download/ download page], and grab the latest Obsidian&#039;s installation zip file. There is no need to register or obtain a license before downloading.&lt;br /&gt;
&lt;br /&gt;
Once you&#039;ve downloaded the zip file, extract it to a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
If you are trying to upgrade to a newer version of Obsidian, see [[Upgrading_Obsidian|upgrade]] instructions.&lt;br /&gt;
&lt;br /&gt;
= Quick Start for Evaluation Purposes =&lt;br /&gt;
&lt;br /&gt;
If you wish to quickly try Obsidian without minimal setup required, follow these steps. Otherwise, skip ahead to [[#Initial Setup|Initial Setup]].&lt;br /&gt;
&lt;br /&gt;
== Really Quick Method Using Embedded Database ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;We do not recommend this setup for production use. &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Ensure you have a JDK (11 or up for Obsidian 6.x.x &amp;amp; 5.x.x, 1.7 or up for Obsidian 4.x.x) installed and that the &amp;lt;code&amp;gt;JAVA_HOME&amp;lt;/code&amp;gt; environment variable is set to your JDK installation directory.&lt;br /&gt;
# Unzip the Obsidian download zip file to a directory of your choice.&lt;br /&gt;
# At the command line, in the zip extraction directory, run the [[Installation_Guide|installer]] using this command, substituting the appropriate Obsidian version number: &amp;lt;code&amp;gt;java -jar Obsidian-Install-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;.jar h2-tomcat-quick-start.xml&amp;lt;/code&amp;gt;&lt;br /&gt;
# Start Obsidian using the command: &amp;lt;code&amp;gt;./webObsidian.sh start scheduler&amp;lt;/code&amp;gt; for Linux or &amp;lt;code&amp;gt;webObsidian.bat start scheduler&amp;lt;/code&amp;gt; for Windows.&lt;br /&gt;
# Go to http://localhost:8080 in your browser and check out your fully functional Obsidian web application and scheduler! You can log in to the admin web application with the default user &#039;&#039;admin&#039;&#039; and password &#039;&#039;changeme&#039;&#039;.&lt;br /&gt;
# When you&#039;re done, stop Obsidian using the command: &amp;lt;code&amp;gt;./webObsidian.sh stop&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;webObsidian.bat stop&amp;lt;/code&amp;gt; for Windows.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; If you restart the Quick Start installation and see &amp;quot;lock wait timeout&amp;quot; or similar errors in the log screen, you may have to delete your embedded H2 database lock file. By default, the file name is &#039;&#039;obsidian.lock.db&#039;&#039; and is located in the user home directory.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; If you see a &amp;lt;code&amp;gt;java.net.BindException: Permission denied&amp;lt;/code&amp;gt; error on startup, you will need to use an alternate port. See [[Troubleshooting]] for details on how to change this.&lt;br /&gt;
&lt;br /&gt;
== Quick Method Using Existing Database ==&lt;br /&gt;
&lt;br /&gt;
If you wish to get Obsidian running quickly using a database platform you already have running, follow these steps:&lt;br /&gt;
&lt;br /&gt;
# Ensure you have a JDK (11 or up for Obsidian 6.x.x and 5.x.x, 1.7 or up for Obsidian 4.x.x) installed and that the &amp;lt;code&amp;gt;JAVA_HOME&amp;lt;/code&amp;gt; environment variable is set to your JDK installation directory.&lt;br /&gt;
# Unzip the Obsidian download zip file to a directory of your choice.&lt;br /&gt;
# At the command line, in the zip extraction directory, run the [[Installation_Guide|installer]] using this command, substituting the appropriate Obsidian version number: &amp;lt;code&amp;gt;java -jar Obsidian-Install-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;.jar&amp;lt;/code&amp;gt;&lt;br /&gt;
# Start Obsidian using the command: &amp;lt;code&amp;gt;./webObsidian.sh start scheduler&amp;lt;/code&amp;gt; for Linux or &amp;lt;code&amp;gt;webObsidian.bat start scheduler&amp;lt;/code&amp;gt; for Windows.&lt;br /&gt;
# Go to http://localhost:8080 in your browser and check out your fully functional Obsidian web application and scheduler! You can log in to the admin web application with the default user &#039;&#039;admin&#039;&#039; and password &#039;&#039;changeme&#039;&#039;.&lt;br /&gt;
# When you&#039;re done, stop Obsidian using the command: &amp;lt;code&amp;gt;./webObsidian.sh stop&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;webObsidian.bat stop&amp;lt;/code&amp;gt; for Windows.&lt;br /&gt;
&lt;br /&gt;
= Initial Setup  =&lt;br /&gt;
&lt;br /&gt;
This section covers the setup required after you&#039;ve selected your [[#Choose_Your_Installation_Type|installation type]]. &lt;br /&gt;
&lt;br /&gt;
== Database ==&lt;br /&gt;
&lt;br /&gt;
Obsidian requires a database which must be created before running Obsidian. Multiple [[#Supported Platforms|database platforms]] are supported. Obsidian can share a database/schema with another application.&lt;br /&gt;
&lt;br /&gt;
Note that the database must exist before deployment, but by default Obsidian will automatically create all required tables.&lt;br /&gt;
&lt;br /&gt;
Later, you will specify database connection parameters within Obsidian&#039;s installer to tell it how to connect. If you need to configure advanced settings or change settings directly after you&#039;ve run run the installer, see [[Advanced Configuration]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Obsidian needs to create the tables in the target database. If the schema is shared with your application’s tables, please ensure there are no name conflicts. If there are conflicts, separate schemas/databases can be used, or a table prefix can be specified as shown in [[Advanced_Configuration#Database_Properties|Advanced Configuration]]. [[Obsidian Tables]] lists the tables Obsidian will created upon first deployment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Manual Schema Creation ===&lt;br /&gt;
&lt;br /&gt;
When you start Obsidian, it will automatically detect and create missing tables in your target database. However, if you wish to run Obsidian with a database user that does not have create privileges, or simply wish to prepare your database structure ahead of time, you can use the database scripts provided with your download zip file under the &amp;quot;db_scripts&amp;quot; directory.&lt;br /&gt;
&lt;br /&gt;
First create your database, and locate the &amp;quot;complete.sql&amp;quot; file under the directory for the database you are using under the &amp;quot;db_scripts&amp;quot; directory. Statements within this file contain the token &amp;quot;$px$&amp;quot; to enable table prefixes. Before you run the SQL file, replace all instances of the token &amp;quot;$px$&amp;quot; (without quotes) with a table prefix 6 characters or shorter (letters and underscores supported), or with blank.&lt;br /&gt;
&lt;br /&gt;
Then, in your SQL client of choice, execute the script and all the required Obsidian tables will be created.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Alternate Oracle Schemas ===&lt;br /&gt;
&lt;br /&gt;
After allowing Obsidian to create all the required tables and initial data by deploying it a single time, Obsidian can be run with an alternate Oracle user by specifying the target schema on Oracle databases. See [[Advanced_Configuration#Database_Properties|Advanced Configuration]] for the property to set.&lt;br /&gt;
&lt;br /&gt;
If you use a separate user from the schema owner, you must grant the user [[Obsidian_Tables#Oracle Privileges|certain privileges]] for Obsidian to function correctly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MS SQL Server Snapshot Isolation ===&lt;br /&gt;
&lt;br /&gt;
For maximum compatibility and to avoid deadlocks, MS SQL Server should be configured to use [https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/sql/snapshot-isolation-in-sql-server read committed snapshot isolation].&lt;br /&gt;
&lt;br /&gt;
This can be enabled on your database by running the following commands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER DATABASE MyDatabase SET ALLOW_SNAPSHOT_ISOLATION ON&lt;br /&gt;
ALTER DATABASE MyDatabase SET READ_COMMITTED_SNAPSHOT ON&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
&lt;br /&gt;
By default, Obsidian manages its own set users and logins to restrict access to the admin web application and REST API. A default “admin” user is created when the scheduler is first deployed and no additional setup is required.&lt;br /&gt;
&lt;br /&gt;
Alternatively, to use LDAP authentication, select the LDAP option in the installer and enter your LDAP details.&lt;br /&gt;
&lt;br /&gt;
As of 7.0.0, you can also select OAuth / OIDC authentication to enable Single Sign-On via an external identity provider. See [[Authenticator#OAuthAuthenticator_(OIDC_SSO)|OAuthAuthenticator]] for details.&lt;br /&gt;
&lt;br /&gt;
Finally, you may implement your own [[authenticator|custom authenticator]] Java class, which you also enter when running the installer.&lt;br /&gt;
&lt;br /&gt;
= Running the Installer =&lt;br /&gt;
&lt;br /&gt;
Now that you&#039;ve chosen your installation type and performed initial setup of your database and authentication, you can run Obsidian&#039;s installer to configure and build a set of artifacts that you can either use to embed Obsidian, or deploy directly.&lt;br /&gt;
&lt;br /&gt;
To run the installer, please follow our detailed [[Installation_Guide|installation guide]].&lt;br /&gt;
&lt;br /&gt;
=== Installer-Created Artifacts ===&lt;br /&gt;
&lt;br /&gt;
Once you&#039;ve run the installer, your installation directory will look something like the following, depending on which artifacts you chose to generate.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
├───db_scripts&lt;br /&gt;
└───Obsidian-7.0.0&lt;br /&gt;
    │   com.carfey.yaml.reference&lt;br /&gt;
    │   obsidian.war&lt;br /&gt;
    │   obsidian-builtin-job-src.jar&lt;br /&gt;
    │   obsidianForkedJob.bat&lt;br /&gt;
    │   obsidianForkedJob.sh&lt;br /&gt;
    │   obsidian-javadoc.zip&lt;br /&gt;
    │   standaloneObsidian.bat&lt;br /&gt;
    │   standaloneObsidian.sh&lt;br /&gt;
    │   standaloneObsidianAdmin.war&lt;br /&gt;
    │   webObsidian.bat&lt;br /&gt;
    │   webObsidian.sh&lt;br /&gt;
    │&lt;br /&gt;
    ├───embed-tomcat-lib  (present when an Embedded Tomcat pack is selected)&lt;br /&gt;
    ├───license&lt;br /&gt;
    ├───logs&lt;br /&gt;
    └───standalone&lt;br /&gt;
        (various JAR files...)&lt;br /&gt;
        obsidian-yaml-configuration.jar&lt;br /&gt;
        obsidian.jar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The installer creates a top-level directory named &#039;&#039;&#039;Obsidian-n.n.n&#039;&#039;&#039; containing generated artifacts. The key files and directories are:&lt;br /&gt;
&lt;br /&gt;
; com.carfey.yaml.reference or com.carfey.properties.reference&lt;br /&gt;
: Copy of the configuration file generated by the installer.&lt;br /&gt;
; obsidian.war&lt;br /&gt;
: Combined scheduler and admin web application WAR. Deploy directly to a servlet container, or run locally using the Embedded Tomcat pack (see below). Customise by adding your job code and dependencies as JARs to &#039;&#039;&#039;/WEB-INF/lib&#039;&#039;&#039; within the archive.&lt;br /&gt;
; standaloneObsidian.bat and standaloneObsidian.sh&lt;br /&gt;
: Windows and Linux scripts to start the standalone scheduler process with no web application. Customise by adding your job code and dependencies as JARs to the &#039;&#039;&#039;standalone&#039;&#039;&#039; directory.&lt;br /&gt;
; webObsidian.bat and webObsidian.sh&lt;br /&gt;
: Windows and Linux scripts to start Obsidian using the embedded Tomcat runtime (requires the &#039;&#039;&#039;Obsidian Embedded Tomcat JAR&#039;&#039;&#039; or &#039;&#039;&#039;Obsidian Standalone Admin Embedded Tomcat JAR&#039;&#039;&#039; pack). Use &#039;&#039;&#039;start scheduler&#039;&#039;&#039; to run the combined scheduler+admin WAR, or &#039;&#039;&#039;start adminOnly&#039;&#039;&#039; to run the standalone admin WAR. Stop with &#039;&#039;&#039;stop&#039;&#039;&#039;.&lt;br /&gt;
; standaloneObsidianAdmin.war&lt;br /&gt;
: Standalone admin web application WAR (no scheduler). Deploy directly to a servlet container or run via the embedded Tomcat pack.&lt;br /&gt;
; embed-tomcat-lib&lt;br /&gt;
: Present when an Embedded Tomcat pack is selected. Contains the embedded Tomcat runtime JARs used by the &#039;&#039;&#039;webObsidian&#039;&#039;&#039; scripts.&lt;br /&gt;
; standalone&lt;br /&gt;
: Directory containing JARs required to run the standalone scheduler process. &#039;&#039;&#039;obsidian-yaml-configuration.jar&#039;&#039;&#039; or &#039;&#039;&#039;obsidian-properties-configuration.jar&#039;&#039;&#039; contains the Obsidian configuration file. To make configuration changes for the standalone scheduler, update the configuration file within this JAR.&lt;br /&gt;
&lt;br /&gt;
= Embedding Obsidian &amp;amp; Customizing Artifacts =&lt;br /&gt;
&lt;br /&gt;
The Obsidian scheduler process needs Java classpath access to your jobs so it can detect valid jobs and execute them. This requires a bit of customization before you are ready to run custom Java jobs. If you still haven&#039;t created your custom jobs, consult [[Implementing Jobs]] before proceeding. If you only intend to use [[Scripting Jobs]], customization will not be required and you can skip to [[#Deployment|Deployment]].&lt;br /&gt;
&lt;br /&gt;
If you want to embed Obsidian into your application or need to deploy jobs and their dependent libraries to the generated Obsidian artifacts, follow the steps in the appropriate sections below.&lt;br /&gt;
&lt;br /&gt;
Note that only Obsidian scheduler processes need to be customized to include your job code. The admin web application itself does not require classpath access to your jobs.&lt;br /&gt;
&lt;br /&gt;
== Embedding Obsidian - Importing Libraries and Properties File ==&lt;br /&gt;
&lt;br /&gt;
To embed Obsidian, you will need to update your application build to bring in the JAR files it requires, along with the Obsidian properties file. Simply follow these steps:&lt;br /&gt;
&lt;br /&gt;
# Import all required [[Advanced_Configuration#Dependent_Libraries|Obsidian JAR files]] into your project and reference them in your build files. &lt;br /&gt;
#* These can be obtained from the &amp;lt;code&amp;gt;standalone&amp;lt;/code&amp;gt; directory of your installation. Make sure you &#039;&#039;&#039;exclude&#039;&#039;&#039; &amp;lt;code&amp;gt;obsidian-(yaml/properties)-configuration.jar&amp;lt;/code&amp;gt;&lt;br /&gt;
#* Ensure your Maven, Gradle or Ant files are updated to include all required libraries in your build, along with your IDE.&lt;br /&gt;
# Make a copy of &amp;lt;code&amp;gt;com.carfey.yaml.reference&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;com.carfey.properties.reference&amp;lt;/code&amp;gt; from your installation with the &amp;lt;code&amp;gt;.reference&amp;lt;/code&amp;gt; suffix removed, and add it to your project&#039;s classpath.&lt;br /&gt;
#* This is typically just a matter of adding it to your project&#039;s resources directory.&lt;br /&gt;
#* From now on, you can update this file to change the various configuration options such as database connection details.&lt;br /&gt;
#* You may wish to leave this file out of source control and let developers configure their own installations. However, any running Obsidian instance will need access to a valid [[Advanced_Configuration#Properties.2FYaml_File|properties file]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Maven users:&#039;&#039;&#039; Note that we do not publish Maven artifacts for Obsidian, so you will not be able to include them by referencing a public repository.&lt;br /&gt;
&lt;br /&gt;
== Adding Custom Jobs to Standalone Scheduler ==&lt;br /&gt;
&lt;br /&gt;
In order for the standalone scheduler to detect and execute custom jobs written in Java, you will need to ensure Obsidian&#039;s classpath contains the compiled job code, along with its dependencies.&lt;br /&gt;
&lt;br /&gt;
To do so, you need to perform just one step before starting the standalone scheduler:&lt;br /&gt;
&lt;br /&gt;
# Copy JAR files containing custom Obsidian jobs and all runtime dependencies to the &amp;lt;code&amp;gt;standalone&amp;lt;/code&amp;gt; directory in your installation.&lt;br /&gt;
#* These JARs should be alongside &amp;lt;code&amp;gt;obsidian.jar&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* All JAR files in this directory will be automatically added to the classpath when run via the &amp;lt;code&amp;gt;standaloneObsidian.sh&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;standaloneObsidian.bat&amp;lt;/code&amp;gt; scripts.&lt;br /&gt;
&lt;br /&gt;
== Adding Custom Jobs to Combined Scheduler and Admin Web Application ==&lt;br /&gt;
&lt;br /&gt;
In order for the combined scheduler and admin web application to detect and execute custom jobs written in Java, you will need to ensure Obsidian&#039;s classpath contains the compiled job code, along with its dependencies.&lt;br /&gt;
&lt;br /&gt;
To do so, you need to perform just one step before deploying the Obsidian WAR file:&lt;br /&gt;
&lt;br /&gt;
# Copy JAR files containing custom Obsidian jobs and all runtime dependencies to the &amp;lt;code&amp;gt;WEB-INF/lib&amp;lt;/code&amp;gt; directory within the WAR archive.&lt;br /&gt;
#* These JARs should be alongside &amp;lt;code&amp;gt;obsidian.jar&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* WAR files use the ZIP format and can be extracted and recompressed with normal ZIP tools or the JDK &amp;lt;code&amp;gt;jar&amp;lt;/code&amp;gt; utility.&lt;br /&gt;
&lt;br /&gt;
== Updating the Properties File in Admin Web Applications ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Note that updating the WAR artifact is not necessary to perform properties file changes when using an external properties file as described [[Advanced_Configuration#Properties_File|here]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you need to change [[Advanced_Configuration#Properties_File|configuration properties]] for a standalone admin web application or combined scheduler and admin web application, follow these steps:&lt;br /&gt;
&lt;br /&gt;
# Obtain the WAR artifact from your installation that requires changes. This is either &amp;lt;code&amp;gt;obsidian.war&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;standaloneObsidianAdmin.war&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Extract the WAR file to a clean directory.&lt;br /&gt;
# Edit the &amp;lt;code&amp;gt;com.carfey.(yaml/properties)&amp;lt;/code&amp;gt; file within the subdirectory &amp;lt;code&amp;gt;WEB-INF/classes&amp;lt;/code&amp;gt; and save your changes.&lt;br /&gt;
# Rebundled the WAR artifact using a zip utility or the JDK &amp;lt;code&amp;gt;jar&amp;lt;/code&amp;gt; utility.&lt;br /&gt;
#* Some zip utilities such as 7Zip will allow you to edit files within an archive directly without the previous steps. It is generally safe to do so.&lt;br /&gt;
&lt;br /&gt;
= Deployment =&lt;br /&gt;
&lt;br /&gt;
You are now ready to deploy your scheduler and/or admin web application.&lt;br /&gt;
&lt;br /&gt;
== Embedded Scheduler ==&lt;br /&gt;
&lt;br /&gt;
When Obsidian is embedded, there is no separate deployment process. However, you will need to start and stop Obsidian with your application. If you are using Spring, we recommend you use our [[Spring Integration]] instead, which will automatically start and stop the scheduler for you.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
During your application startup, once it is fully initialized (or as close as possible), start Obsidian, and save a reference to the returned result so you can shut it down later:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// This will start the scheduler on the first call to get().&lt;br /&gt;
&lt;br /&gt;
com.carfey.ops.job.SchedulerStarter starter = com.carfey.ops.job.SchedulerStarter.get(com.carfey.ops.job.SchedulerStarter.SchedulerMode.EMBEDDED);&lt;br /&gt;
&lt;br /&gt;
// ...&lt;br /&gt;
&lt;br /&gt;
// Later, we need to gracefully shut down the scheduler &lt;br /&gt;
starter.shutDown();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will run Obsidian&#039;s scheduler process, but will not include any of the web application or the REST API. This functionality is provided by the admin web application.&lt;br /&gt;
&lt;br /&gt;
== Standalone Admin Web Application ==&lt;br /&gt;
&lt;br /&gt;
To deploy the standalone admin web application, simply deploy the &amp;lt;code&amp;gt;standaloneObsidianAdmin.war&amp;lt;/code&amp;gt; file your servlet container of choice (e.g. Tomcat) after configuring it appropriately. You may rename the WAR file to have it deployed under a different context path, if desired (e.g. &amp;quot;ROOT.war&amp;quot; or &amp;quot;obsidian.war&amp;quot;). Consult your servlet documentation to find out how to deploy the application and start the servlet container.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; If you want to use the included Jetty server as your servlet container, you can use the scripts included in your installation instead of deploying the WAR. This will make the application accessible at http://localhost:8080.&lt;br /&gt;
* To start &lt;br /&gt;
** Linux: &amp;lt;code&amp;gt;./webObsidian.sh start adminOnly&amp;lt;/code&amp;gt;&lt;br /&gt;
** Windows: &amp;lt;code&amp;gt;webObsidian.bat start adminOnly&amp;lt;/code&amp;gt;&lt;br /&gt;
* To stop&lt;br /&gt;
** Linux: &amp;lt;code&amp;gt;./webObsidian.sh stop&amp;lt;/code&amp;gt; &lt;br /&gt;
** Windows: &amp;lt;code&amp;gt;webObsidian.bat stop&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Security Note:&#039;&#039;&#039; By default, the admin web application allows non-secure connections. If you wish to force secure connections through HTTPS, you can edit the web.xml in your war and uncomment the &amp;lt;security-constraint&amp;gt; element in the file. This will force all requests to redirect to an encrypted connection. For details on setting up SSL on your servlet container, refer to its documentation.&lt;br /&gt;
&lt;br /&gt;
== Standalone Scheduler ==&lt;br /&gt;
&lt;br /&gt;
To deploy and run the standalone scheduler, you may use the provided scripts in your installation directory:&lt;br /&gt;
* Linux: &amp;lt;code&amp;gt;./standaloneObsidian.sh start&amp;lt;/code&amp;gt;&lt;br /&gt;
* Windows: &amp;lt;code&amp;gt;standaloneObsidian.bat start&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You should always stop Obsidian gracefully when possible by using:&lt;br /&gt;
* Linux: &amp;lt;code&amp;gt;./standaloneObsidian.sh stop&amp;lt;/code&amp;gt;&lt;br /&gt;
* Windows: &amp;lt;code&amp;gt;standaloneObsidian.bat stop&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Both the start and stop commands may be supplied an additional argument to override the &amp;lt;code&amp;gt;listenerPort&amp;lt;/code&amp;gt; which defaults to 10451.&lt;br /&gt;
&lt;br /&gt;
Rather than use one of the provided scripts, you can invoke the equivalent Java command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java com.carfey.ops.job.SchedulerStarter start &amp;lt;listenerPort&amp;gt;&lt;br /&gt;
java com.carfey.ops.job.SchedulerStarter stop &amp;lt;listenerPort&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Combined Scheduler and Admin Web Application ==&lt;br /&gt;
&lt;br /&gt;
To deploy the combined scheduler and admin web application, simply deploy the &amp;lt;code&amp;gt;obsidian.war&amp;lt;/code&amp;gt; file your servlet container of choice (e.g. Tomcat) after configuring it appropriately. You may rename the WAR file to have it deployed under a different context path, if desired (e.g. &amp;quot;ROOT.war&amp;quot;). Consult your servlet documentation to find out how to deploy the application and start the servlet container.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; If you want to use the included Jetty server as your servlet container, you can use the scripts included in your installation instead of deploying the WAR.  This will make the web application accessible at the URL http://localhost:8080.&lt;br /&gt;
&lt;br /&gt;
* To start &lt;br /&gt;
** Linux: &amp;lt;code&amp;gt;./webObsidian.sh start scheduler&amp;lt;/code&amp;gt;&lt;br /&gt;
** Windows: &amp;lt;code&amp;gt;webObsidian.bat start scheduler&amp;lt;/code&amp;gt;&lt;br /&gt;
* To stop&lt;br /&gt;
** Linux: &amp;lt;code&amp;gt;./webObsidian.sh stop&amp;lt;/code&amp;gt; &lt;br /&gt;
** Windows: &amp;lt;code&amp;gt;webObsidian.bat stop&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Security Note:&#039;&#039;&#039; By default, the admin web application allows non-secure connections. If you wish to force secure connections through HTTPS, you can edit the web.xml in your war and uncomment the &amp;lt;security-constraint&amp;gt; element in the file. This will force all requests to redirect to an encrypted connection. For details on setting up SSL on your servlet container, refer to its documentation.&lt;br /&gt;
&lt;br /&gt;
== Embedding the Obsidian Web Application in Another Web Application ==&lt;br /&gt;
&lt;br /&gt;
We do not generally recommend attempting to merge the Obsidian admin web application with another servlet web application, but it can be done by following these steps:&lt;br /&gt;
&lt;br /&gt;
To embed the full Obsidian web application in an existing web application, you will need to extract the necessary sections from the &amp;lt;code&amp;gt;WEB-INF/web.xml&amp;lt;/code&amp;gt; file in the &amp;lt;code&amp;gt;obsidian.war&amp;lt;/code&amp;gt; file and merge them into your application&#039;s &amp;lt;code&amp;gt;web.xml&amp;lt;/code&amp;gt; file. This includes all &amp;quot;listener&amp;quot;, &amp;quot;servlet&amp;quot;, &amp;quot;servlet-mapping&amp;quot;, &amp;quot;jsp-config&amp;quot;, &amp;quot;filter&amp;quot;, &amp;quot;filter-mapping&amp;quot; elements, and optionally &amp;quot;welcome-file-list&amp;quot; and &amp;quot;error-page&amp;quot; elements. Ensure that all servlet paths are maintained. If you are using a different servlet specification version, you may need to update the mappings to the appropriate format.&lt;br /&gt;
&lt;br /&gt;
Note the use of our &amp;lt;code&amp;gt;com.carfey.ops.servlet.StartupShutdownListener&amp;lt;/code&amp;gt; which takes care of starting up the scheduler instance and using the web container&#039;s default shutdown mechanism to ensure graceful shutdown. This listener will start Obsidian&#039;s scheduler process and initialize the Obsidian web application. &lt;br /&gt;
&lt;br /&gt;
If you wish to embed Obsidian&#039;s web application without the scheduler running, include the following parameter element in your &amp;lt;code&amp;gt;web.xml&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;context-param&amp;gt;&lt;br /&gt;
   &amp;lt;param-name&amp;gt;schedulerEnabled&amp;lt;/param-name&amp;gt;&lt;br /&gt;
   &amp;lt;param-value&amp;gt;false&amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Additional Deployment Details ==&lt;br /&gt;
&lt;br /&gt;
=== Classpath Notes ===&lt;br /&gt;
&lt;br /&gt;
To run a scheduler with your custom code and jobs, you need to ensure the scheduler process classpath includes your code packaged into JAR files, as described [[#Embedding_Obsidian_.26_Customizing_Artifacts|above]]. &lt;br /&gt;
&lt;br /&gt;
If a compiled job is updated, you will have to restart your application or the servlet container after deploying updated jars, unless you are using [[Job Forking]].&lt;br /&gt;
&lt;br /&gt;
=== Setting Host Names ===&lt;br /&gt;
Obsidian instances will automatically assign themselves host names if no host name is explicitly set, but you may wish to give them explicit names to make scheduling and monitoring simpler.&lt;br /&gt;
&lt;br /&gt;
If you wish to assign explicit names, simply set the Java system property &amp;lt;code&amp;gt;schedulerDesignation&amp;lt;/code&amp;gt; to the host name of your choice. For example, if starting an instance using the standalone scheduler using &amp;lt;code&amp;gt;java&amp;lt;/code&amp;gt; directly, simply add the value &amp;lt;code&amp;gt;-DschedulerDesignation=myHostName&amp;lt;/code&amp;gt; to the end of the command.&lt;br /&gt;
&lt;br /&gt;
You may also use a properties file setting for the host name as detailed in [[Advanced Configuration]].&lt;br /&gt;
&lt;br /&gt;
=== Disabling Automatic Database Updates ===&lt;br /&gt;
&lt;br /&gt;
Obsidian automatically applies schema updates and data upgrades to its database on startup. In some cases, it may be desirable to disable this once the database has been fully initialized and upgrades to new versions are not going to be deployed. For example, you may wish to run Obsidian with a user who does not have privileges to modify the database schema.&lt;br /&gt;
&lt;br /&gt;
To do so, you can either set a Java system property, or if you are using the admin web application WAR, you can add a setting to your &amp;lt;code&amp;gt;WEB-INF/web.xml&amp;lt;/code&amp;gt; within the archive.&lt;br /&gt;
&lt;br /&gt;
As a system property:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-DstartupRunnerClass=com.carfey.ops.run.NullRunner&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In &amp;lt;code&amp;gt;WEB-INF/web.xml&amp;lt;/code&amp;gt;, after any &amp;lt;code&amp;gt;listener&amp;lt;/code&amp;gt; elements:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;context-param&amp;gt;&lt;br /&gt;
    &amp;lt;param-name&amp;gt;startupRunnerClass&amp;lt;/param-name&amp;gt;&lt;br /&gt;
    &amp;lt;param-value&amp;gt;com.carfey.ops.run.NullRunner&amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Disabling DDL Updates ===&lt;br /&gt;
&lt;br /&gt;
It may also be helpful to apply schema updates (DDL) outside Obsidian through a privileged account, but allow Obsidian upgrades to make the necessary data initialization/modifications. This can be done using a &#039;&#039;&#039;skipDDL&#039;&#039;&#039; configuration property documented under [[Advanced_Configuration#Miscellaneous_Properties | Advanced Configuration]].&lt;br /&gt;
&lt;br /&gt;
=== Disabling Job Scheduling in the Web Application ===&lt;br /&gt;
&lt;br /&gt;
If you have combined scheduler and admin web application WAR already built, you can easily tweak it to disable the scheduler process. &lt;br /&gt;
&lt;br /&gt;
Simply add the following to your &amp;lt;code&amp;gt;WEB-INF/web.xml&amp;lt;/code&amp;gt; within the WAR archive after any &amp;lt;code&amp;gt;listener&amp;lt;/code&amp;gt; elements:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;context-param&amp;gt;&lt;br /&gt;
    &amp;lt;param-name&amp;gt;schedulerEnabled&amp;lt;/param-name&amp;gt;&lt;br /&gt;
    &amp;lt;param-value&amp;gt;false&amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= You’re Good to Go! =&lt;br /&gt;
&lt;br /&gt;
You&#039;re now ready to log into the web application and start scheduling jobs! The URL you use to access Obsidian will depend on how it&#039;s been deployed, but will typically be something like http://localhost/obsidian, or http://localhost/standadminObsidianAdmin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Default User:&#039;&#039;&#039; Each Obsidian installation using native authentication starts with a single default user named &#039;&#039;admin&#039;&#039; with password &#039;&#039;changeme&#039;&#039;. You should change this after your first log in. See [[Admin_User_Management|User Management]] for how to change a user&#039;s password.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
At this point we suggest you play around with the admin web application. Many screens offer inline help. Otherwise, you can refer to our [[Admin Web Application Guide]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To get started writing jobs that you can run in Obsidian, see [[Implementing_Jobs|Implementing Jobs]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
See the &#039;&#039;&#039;[[User Guide]]&#039;&#039;&#039; if you have questions or wish to explore what Obsidian offers.&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Release_Notes&amp;diff=4085</id>
		<title>Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Release_Notes&amp;diff=4085"/>
		<updated>2026-07-09T20:18:24Z</updated>

		<summary type="html">&lt;p&gt;Craig: /* Features / Enhancements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Please review our [[Upgrading_Obsidian|Upgrade Instructions]].&lt;br /&gt;
&lt;br /&gt;
Read about our [[Planned_Releases|Planned Releases]].&lt;br /&gt;
&lt;br /&gt;
Looking for old release notes? See [[Release_Notes_-_Older_Releases|Release Notes - Older Releases]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toclimit-2&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obsidian 7.0.0 ==&lt;br /&gt;
&lt;br /&gt;
To Be Released July 2026&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;OAuth 2.0 / OIDC Single Sign-On&#039;&#039;&#039; — Obsidian now supports OAuth 2.0 / OIDC SSO authentication via [[Authenticator#OAuthAuthenticator_(OIDC_SSO)|OAuthAuthenticator]]. Configure any OIDC-compliant identity provider (Keycloak, Microsoft Entra ID, Okta, Auth0, or Generic OIDC) as the login provider. See [[Advanced_Configuration#OAuth_/_OIDC_Authentication_Properties|OAuth/OIDC Authentication Properties]] for full configuration details.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Bearer JWT authentication for the REST API&#039;&#039;&#039; — REST clients can now authenticate using a signed JWT access token in the &#039;&#039;Authorization: Bearer&#039;&#039; header. See [[Advanced_Configuration#OAuth_/_OIDC_Authentication_Properties|OAuth/OIDC Authentication Properties]] for configuration.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Installer upgrade (IzPack 5)&#039;&#039;&#039; — Obsidian 7.0.0 ships an IzPack 5-based installer. GUI and headless installs behave as in Obsidian 6 for standard flows. Customers with saved Obsidian 6 automated install XML must run the migrate helper included in the download before headless install. See [[Upgrading_Obsidian#Migrating_saved_automated_install_XML_.28Obsidian_6_.E2.86.92_7.29|Upgrading Obsidian]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Embedded Tomcat quick start&#039;&#039;&#039; — Jetty quick-start pack removed; evaluation and local runs now use Apache Tomcat 10.1.x embedded runtime (Jakarta Servlet 5). The release zip includes &#039;&#039;&#039;h2-tomcat-quick-start.xml&#039;&#039;&#039; as a ready-to-use sample. Four installer deployment profiles are available: Obsidian WAR, Obsidian Embedded Tomcat JAR, Obsidian Standalone Admin WAR, and Obsidian Standalone Admin Embedded Tomcat JAR. See [[Installation_Guide#Deployment_options|Deployment options]] and [[Installation_Guide#Starting_embedded_Tomcat|Starting embedded Tomcat]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Global parameter autocomplete and tooltips&#039;&#039;&#039; — While editing a job, typing &#039;&#039;{{&#039;&#039; in a parameter value opens suggestions for global parameter names (subject to visibility settings). On job view, hover over values containing &#039;&#039;Name&#039;&#039; to see resolved global values when your user&#039;s permissions allow. Administration screens for defining global parameters are unchanged. See [[Advanced_Configuration|Advanced Configuration]] for visibility settings.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Install-time dependency resolution&#039;&#039;&#039; — The published installer download does not embed public open-source JARs. Libraries are fetched (or read from a pre-staged cache) when you run the installer. See [[Installation_Guide#Offline_or_restricted-network_install|Offline install]] for air-gapped preparation steps.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Modular Groovy and Flexmark libraries&#039;&#039;&#039; — Obsidian no longer ships &#039;&#039;&#039;apache-groovy-all-4.0.24.jar&#039;&#039;&#039; or &#039;&#039;&#039;flexmark-util-0.62.2.jar&#039;&#039;&#039; uber archives. Scripting and UI documentation rendering use the modular JAR sets documented in [[Advanced_Configuration#Dependent_Libraries|Dependent Libraries]].&lt;br /&gt;
&lt;br /&gt;
=== Removals ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Remember Me login option removed&#039;&#039;&#039; — The Remember Me checkbox and associated session-cookie mechanism have been removed. The &#039;&#039;USER_COOKIE&#039;&#039; table and &#039;&#039;allowRememberMe&#039;&#039; system parameter are removed automatically during the upgrade to 7.0.0; no operator action is required.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;User logout&#039;&#039;&#039; - Fixed an issue where users were not fully logged out in certain session states.&lt;br /&gt;
* &#039;&#039;&#039;Job edit screen accessible to users with no roles&#039;&#039;&#039; — Users with no assigned roles could previously access the job edit screen but not make changes; this has been corrected.&lt;br /&gt;
* &#039;&#039;&#039;Firefox UI icons&#039;&#039;&#039; — Fixed icons not rendering correctly in Firefox.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.4.0 ==&lt;br /&gt;
Released December 2025&lt;br /&gt;
&lt;br /&gt;
=== Enhancements === &lt;br /&gt;
* New [[Built-in_Jobs#Obsidian_Execution_Statistics_Job|Execution Statistics Job]] and built in [[Admin_Job_Stats|UI]] and [[Embedded_API#List_Stats|Embedded API]] and [[REST_Endpoints#GET_a_list_of_job_execution_statistics|REST API]]&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Fixed issue preventing [[Admin_Jobs#Deleting|job deletion]] when resubmissions of failed executions existed. Bug existed in UI and APIs.&lt;br /&gt;
* Fixed UI styling issue for [[Admin_Jobs#Deleting|job deletion]] where checkbox label did not appear.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.3 ==&lt;br /&gt;
Released November 2025&lt;br /&gt;
&lt;br /&gt;
=== Enhancements === &lt;br /&gt;
* [https://web.obsidianscheduler.com/obsidianapi/com/carfey/suite/security/LdapAuthenticator.html LDAPAuthenticator] supports configurable check user active override - com.carfey.suite.security.LdapAuthenticator.checkActiveAttribute&lt;br /&gt;
* [https://web.obsidianscheduler.com/obsidianapi/com/carfey/suite/security/LdapAuthenticator.html#isUserActive(javax.naming.directory.DirContext,java.lang.String) LDAPAuthenticator.isUserActive(DirContext,String)] visibility increased to protected to allow for functionality override in subclasses.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Correct LdapAuthenticator case with delimited configuration where active check wasn&#039;t applied.&lt;br /&gt;
* [https://web.obsidianscheduler.com/obsidianapi/com/carfey/suite/security/LdapAuthenticator.html#isUserActive(javax.naming.directory.DirContext,java.lang.String) LDAPAuthenticator.isUserActive(DirContext,String)] javadoc added for isUserActive fully detailing the implementation.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.2 ==&lt;br /&gt;
Released October 2025&lt;br /&gt;
&lt;br /&gt;
=== Enhancements === &lt;br /&gt;
* Notification failures now trigger Dispatch category Error level event on first failure. For use in log alerts and Event Hooks.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Notification failures no longer log on every failure reducing chatty failure logs.&lt;br /&gt;
* No-arg constructors added to multiple JSON serializable candidate POJOs missing them. Addresses GSON&#039;s workaround use of sun.misc.Unsafe.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.1 ==&lt;br /&gt;
Released August 2025&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Fix failure response codes on [[REST_Endpoints#GET_health_details_on_an_existing_scheduling_host|REST health endpoint]]&lt;br /&gt;
* Fix automatic upgrade issue from 6.1.0 to any of 6.2.0, 6.2.1, 6.3.0&lt;br /&gt;
* Fix auth issue when [[Admin_User_Management#Multi-Factor_Authentication_.28MFA.29|MFA]] is enabled that allows REST access when account has been locked out due to MFA not being setup.  [[Contact_the_Obsidian_Scheduler_Team|Contact us]] if you need workaround details for earlier versions.&lt;br /&gt;
* Fix native auth issue that allows REST access when account has been flagged as inactive.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.0 ==&lt;br /&gt;
Released July 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Cron day of month expansion for [[Cron#Special_Character_Usage|day of week proximity]] using [[Cron#Examples|~]]&lt;br /&gt;
* Annotation based job and chain configuration [[Initializing_and_Restoring#Annotation_Initialization|initialization]]&lt;br /&gt;
* Health endpoint with details for Job Queuer and Job Spawner - [[REST_Endpoints#GET_health_details_on_an_existing_scheduling_host|REST API]] or Embedded API [https://web.obsidianscheduler.com/obsidianapi/com/carfey/ops/api/embedded/HostManager.html#getHealth(java.lang.String) by hostname] or [https://web.obsidianscheduler.com/obsidianapi/com/carfey/ops/api/embedded/HostManager.html#getHealth(long) by host id]&lt;br /&gt;
* JDBC URL construction from parts [[Advanced_Configuration#Database_Properties|host/port/databaseName/dbType/oracleSid]]&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.2.1 ==&lt;br /&gt;
Released June 2025&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Certain recoveries greater than 24 hours using new day of month proximity patterns introduced in 6.2.0 would result in no jobs spawning.&lt;br /&gt;
* Migrations targeting 6.0.0 and greater that start earlier than 5.0.0 skip the 5.0.0 migration. Migrating to any 5.x version first and then to 6.0.0 or later works around this issue.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.2.0 ==&lt;br /&gt;
Released May 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Cron day of month expansion for [[Cron#Special_Character_Usage|day of week proximity]] using [[Cron#Examples|&amp;lt; &amp;gt; ≥ ≤]]&lt;br /&gt;
* Cron day of month expansion for [[Cron#Special_Character_Usage|weekday proximity]] using [[Cron#Examples|&amp;lt; &amp;gt; ≥ ≤]]&lt;br /&gt;
* [[Admin_Global_Parameters#Using_Global_Parameters_in_Jobs|Global Parameters]] reference in job edit page support mouseover/title display of actual value when permissions allow&lt;br /&gt;
* Host time displayed in [[Admin_Host_Status|hosts status]] in UI&lt;br /&gt;
* [[Admin_Job_Runtime_Preview|Runtime Preview]] optimizations for large date ranges in both UI and APIs.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Combination of table prefix, sorting by clob column and Oracle metadata load failure no longer results in sql error. This occurred in the UI when viewing raw job history results and in API calls for job runtime results.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.1.1 ==&lt;br /&gt;
Released March 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Authenticator#Implementation_of_a_Custom_Authenticator|Authenticator]] supports optional &amp;lt;code&amp;gt;authenticateREST()&amp;lt;/code&amp;gt; method.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication REST logins do not apply &#039;last login&#039; timestamps. Avoids noisy error that was appearing in logs.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.1.0 ==&lt;br /&gt;
Released March 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication now disables users after 4 invalid login attempts, either password or MFA code if applicable. Invalid attempts threshold is configurable.&lt;br /&gt;
* Native authentication last login datetime displayed on list user screen.&lt;br /&gt;
* Stronger licensing controls. Site and hardware licenses as of this version must be regenerated by Carfey Software and every 2 years. Contact us at licensing [[Image:atSymbol.png]] obsidianscheduler.com.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication password complexity pattern properly created and no longer overwritten on restart.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.0.1 ==&lt;br /&gt;
Released February 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Built-in_Jobs#File_Archive_Job|File Archive Job]] and [[Built-in_Jobs#File_Scanner_Job|File Scanner Job]] both now support min/max file sizes and minimum age.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication user updates now support long passwords.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.0.0 ==&lt;br /&gt;
Released December 27, 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Jakarta Servlet 5.0&lt;br /&gt;
** Servlet container for Web Admin must support Jakarta Servlet 5.0 (e.g. Tomcat 10, Jetty 11)&lt;br /&gt;
* [[Micronaut_Integration|Micronaut]] integration support&lt;br /&gt;
* [[Advanced_Configuration#Dependent_Libraries|Groovy 4]] support&lt;br /&gt;
* [[Advanced_Configuration#Properties.2FYaml_File|Yaml]] configuration support&amp;lt;ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are using automated installer files from previous releases, you will need to add an additional configuration item to choose between yaml and properties formats in UserInputPanel.0.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;com.izforge.izpack.panels.UserInputPanel id=&amp;quot;UserInputPanel.0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;userInput&amp;gt;&lt;br /&gt;
......snip......&lt;br /&gt;
            &amp;lt;entry key=&amp;quot;config.format&amp;quot; value=&amp;quot;yaml&amp;quot; /&amp;gt;&lt;br /&gt;
OR&lt;br /&gt;
            &amp;lt;entry key=&amp;quot;config.format&amp;quot; value=&amp;quot;properties&amp;quot; /&amp;gt;&lt;br /&gt;
......snip......&lt;br /&gt;
        &amp;lt;/userInput&amp;gt;&lt;br /&gt;
    &amp;lt;/com.izforge.izpack.panels.UserInputPanel&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Native authentication supports customizable [[Admin_Login#Password_Complexity|password complexity]] requirements&lt;br /&gt;
* XML support deprecated across the product including XML UI downloads, XML runner configurations and XML license leases.&lt;br /&gt;
** &#039;&#039;&#039;Starting January 1st 2027, XML license lease requests will stop being processed. All Obsidian instances running using internet-verified licenses (including licence key proxies) will be required to use release 6.0.0 or later as of January 1st 2027.&#039;&#039;&#039;&lt;br /&gt;
** Above noted XML support will be removed in the first Obsidian version released in 2027.&lt;br /&gt;
* License leases use JSON payloads.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.5.1 ==&lt;br /&gt;
Released December 16, 2024&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Admin only (no scheduler) UI no longer generates event hook errors while running nor during shutdown&lt;br /&gt;
* Quick start installer file no longer generates errors during installation&lt;br /&gt;
* A few small web UI enhancements&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.5.0 ==&lt;br /&gt;
Released October 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Event Hooks management available in [[Admin_Host_Status#Event_Hook_Status|UI]], [[Embedded_API#Event_Hook_Resume_or_Pause|Embedded API]] and [[REST_Endpoints#POST_event_hook_pause_or_resume|REST API]].&lt;br /&gt;
* [[Installation_Guide#Additional_configuration_items|Installer]] supports custom add on configurations    &#039;&#039;&#039;Potential breaking change to automated installer files.&#039;&#039;&#039; &amp;lt;ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are using automated installer files from previous releases, you will need to add a new section of xml as of Obsidian 5.5.0 to handle a new UserInputPanel. Immediately after the UserInputPanel.17 closing brace, add the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;com.izforge.izpack.panels.UserInputPanel id=&amp;quot;UserInputPanel.18&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;userInput&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.1&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.2&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.3&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.4&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.5&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.6&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.7&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.8&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.9&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.10&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.11&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.12&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.13&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.14&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.15&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.16&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.17&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.18&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.19&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.20&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.1&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.2&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.3&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.4&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.5&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.6&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.7&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.8&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.9&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.11&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.10&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.12&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.13&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.14&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.15&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.16&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.17&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.18&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.19&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.20&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/userInput&amp;gt;&lt;br /&gt;
&amp;lt;/com.izforge.izpack.panels.UserInputPanel&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Certain Cron expressions that fail to generate text descriptions no longer impact scheduling.&lt;br /&gt;
* Text database columns were previously restricted to maximum length of MySQL implementation. Corrected to validate length via DB implementation.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.4.0 ==&lt;br /&gt;
Released June 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Event Hooks available in [[Embedded_API#List_Event_Hooks|Embedded API]] and [[REST_Endpoints#GET_event_hooks|REST API]].&lt;br /&gt;
* [[Advanced_Configuration#Dependent_Libraries|GSON library]] upgrade to support Java 21&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Oracle identifier no longer too long when using prefixes.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.3.0 ==&lt;br /&gt;
Released March 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* New [[Admin_Host_Status#Event_Hook_Status| Event Hooks Status]] available in the UI.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Some improvements throughout the [[Admin_Web_Application_Guide|Admin Web Application]] for autofocus of fields.&lt;br /&gt;
* Additional classes and interfaces added to [https://web.obsidianscheduler.com/obsidianapi/ javadoc].&lt;br /&gt;
* Some cleanup in [https://web.obsidianscheduler.com/obsidianapi/ javadoc] documenation.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.2.1 == &lt;br /&gt;
Released January 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Built-in_Jobs#Maintenance_Jobs|Maintenance Jobs]] are now scheduled by default in new installations. Can be disabled via [[Advanced_Configuration#Miscellaneous_Properties|Configuration]] property.&lt;br /&gt;
* New [[Event_Hooks#Standard_Output.2FError_Streams_Event_Hook | Standard Output/Error Streams Event Hook]].&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Schedule descriptions are now updated after edits are applied in all UI screens and APIs.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.2.0 ==&lt;br /&gt;
Released December 2023&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Cron]] &amp;amp; [[Cron#Recurrence|Recur]] patterns along with any use of [[Admin_Schedule_Aliases|Schedule Aliases]] now support plain language description of the patterns throughout the [[Admin_Web_Application_Guide|UI]], visible while hovering patterns, and in [[REST_Endpoints|REST]] and [[Embedded_API|Embedded]] API responses.&lt;br /&gt;
* All screens supporting UI exports now support JSON ([[Admin_Job_Activity#Exporting_Results|Job Activity]], [[Admin_Jobs#Exporting_Results|Jobs]], [[Admin_Job_Runtime_Preview#Exporting_Results|Runtime Previews]], [[Admin_Job_Chains#Job_Chain_Listing|Job Chains]], [[Admin_Logs#Exporting_Results|Logs]], [[Admin_Notifications#Exporting_Results|Sent Notifications]], [[Admin_User_Management#Exporting_Results|Users]], [[Admin_Custom_Calendars#Calendar_Listing|Calendars]])&lt;br /&gt;
* All screens supporting UI exports and search criteria and/or inline filters now include any specified search criteria and filter text in Excel, XML and JSON downloads ([[Admin_Job_Activity#Exporting_Results|Job Activity]], [[Admin_Jobs#Exporting_Results|Jobs]], [[Admin_Job_Runtime_Preview#Exporting_Results|Runtime Previews]], [[Admin_Job_Chains#Job_Chain_Listing|Job Chains]], [[Admin_Logs#Exporting_Results|Logs]], [[Admin_Notifications#Exporting_Results|Sent Notifications]], [[Admin_User_Management#Exporting_Results|Users]])&lt;br /&gt;
* Support for [[Installation_Guide#Choosing_Email_Support|Jakarta EE mail]] &#039;&#039;&#039;Potential breaking change to automated installer files.&#039;&#039;&#039; &amp;lt;ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are using automated installer files from previous releases and had email configured, you will need to add a new section of xml as of Obsidian 5.2.0 to handle a new UserInputPanel. Immediately after the UserInputPanel.16 closing brace, add the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;com.izforge.izpack.panels.UserInputPanel id=&amp;quot;UserInputPanel.17&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;userInput&amp;gt;&lt;br /&gt;
        &amp;lt;entry key=&amp;quot;mail.type.selection&amp;quot; value=&amp;quot;javax&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/userInput&amp;gt;&lt;br /&gt;
&amp;lt;/com.izforge.izpack.panels.UserInputPanel&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
* New [[Event_Hooks#REST_Endpoint_Event_Hook|REST Endpoint Event Hook]]&lt;br /&gt;
* [[Key_Server_Proxy|Key Server proxy]] artifact obtained via web download during installation&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Time picker buttons (hour, minute, AM/PM) in [[Admin_Job_Activity#Filtering|Job Activity filtering]] no longer change other elements of the selected time.&lt;br /&gt;
* Cron pattern with [[Cron#Special_Character_Usage|LW]] and any other non-L value in day position no longer also incorrectly evaluates to last day.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.1.1 ==&lt;br /&gt;
Released June 2023&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* [[Authenticator|Native authentication]] no longer fails when user deletes are attempted from the UI.&lt;br /&gt;
* Built in maintenance job [[Built-in_Jobs#Job_History_Cleanup_Job|Job History Cleanup]] no longer leaves deletion candidate CHAIN SKIPPED records in the JOB_HISTORY table in rare circumstances.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.1.0 ==&lt;br /&gt;
Released April 2023&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Admin_Schedule_Aliases#Schedule_Alias_Fragments|Schedule Aliases]] now support fragments for configuration-time substitutions.&lt;br /&gt;
* New convenience job [[Built-in_Jobs#Database_File_Export_Job|Database File Export Job]] for generating basic file extracts from database queries.&lt;br /&gt;
* New convenience job [[Built-in_Jobs#REST_Invocation_Job|REST Invocation Job]] for making simple REST calls and storing results.&lt;br /&gt;
* Performance improvements in job failure handling.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.4 == &lt;br /&gt;
Released February 2022&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.17.1 as fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.17.1 RCE vulnerability] where attackers can modify log4j configuration.&lt;br /&gt;
* Restore missing default log4j2 configuration in installation artifacts.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.3 == &lt;br /&gt;
Released December 2021&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.17.0 as fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.17.0 DOS vulnerability]&lt;br /&gt;
* Fix native login issue showing as inactive on some databases.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.2 == &lt;br /&gt;
Released December 2021&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.16.0 as permanent fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.16.0 RCE vulnerability]&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.1 == &lt;br /&gt;
Released December 2021&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.15.0 as fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.15.0 RCE vulnerability]&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
* Fix sporadic native login issue on some databases.&lt;br /&gt;
* Formatting fix in quick installer file&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.0 == &lt;br /&gt;
Released August 2021.&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Java 11 (minimum Java version)&lt;br /&gt;
* [[Admin_Schedule_Aliases|Schedule Aliases]] including support in [[REST_Endpoints#Schedule_Alias_Endpoints|REST API]] and [[Embedded_API#ScheduleAliasManager_API|Embedded API]]&lt;br /&gt;
* [[Admin_User_Management#Multi-Factor_Authentication_.28MFA.29|MFA Support]] for UI logins&lt;br /&gt;
* New [[Admin_User_Management#User_Rights|Author and Operator]] roles&lt;br /&gt;
* Convention-based role permissions by [[Admin_User_Management#Job_Folder_Rights|root job folder]] for Write, Author and Operator.&amp;lt;ref&amp;gt;&lt;br /&gt;
There is a possibility of a breaking change to Embedded or REST API use due to the need to change the [[Embedded_API#Enumerations|User Role enumeration]] from a Java enum to an enum-style class to support this feature. Bringing in the upgraded Obsidian library and compiling should reveal any such broken use of these enumerations. Needed changes should be minor and self-explanatory.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Bundled Jetty 10.0.2&lt;br /&gt;
* Legacy Embedded API (from Obsidian 1.5) dropped&lt;br /&gt;
* Signal handler disabled by default. Enabled only via [[Advanced_Configuration#Miscellaneous_Properties|configuration]].&lt;br /&gt;
* Many [[Advanced_Configuration#Dependent_Libraries|library upgrades]].&lt;br /&gt;
* UI javascript library updates.&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Release_Notes&amp;diff=4084</id>
		<title>Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Release_Notes&amp;diff=4084"/>
		<updated>2026-07-09T20:17:57Z</updated>

		<summary type="html">&lt;p&gt;Craig: /* Features / Enhancements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Please review our [[Upgrading_Obsidian|Upgrade Instructions]].&lt;br /&gt;
&lt;br /&gt;
Read about our [[Planned_Releases|Planned Releases]].&lt;br /&gt;
&lt;br /&gt;
Looking for old release notes? See [[Release_Notes_-_Older_Releases|Release Notes - Older Releases]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toclimit-2&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obsidian 7.0.0 ==&lt;br /&gt;
&lt;br /&gt;
To Be Released July 2026&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;OAuth 2.0 / OIDC Single Sign-On&#039;&#039;&#039; — Obsidian now supports OAuth 2.0 / OIDC SSO authentication via [[Authenticator#OAuthAuthenticator_(OIDC_SSO)|OAuthAuthenticator]]. Configure any OIDC-compliant identity provider (Keycloak, Microsoft Entra ID, Okta, Auth0, or Generic OIDC) as the login provider. See [[Advanced_Configuration#OAuth_/_OIDC_Authentication_Properties|OAuth/OIDC Authentication Properties]] for full configuration details.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Bearer JWT authentication for the REST API&#039;&#039;&#039; — REST clients can now authenticate using a signed JWT access token in the &#039;&#039;Authorization: Bearer&#039;&#039; header. See [[Advanced_Configuration#OAuth_/_OIDC_Authentication_Properties]] for configuration.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Installer upgrade (IzPack 5)&#039;&#039;&#039; — Obsidian 7.0.0 ships an IzPack 5-based installer. GUI and headless installs behave as in Obsidian 6 for standard flows. Customers with saved Obsidian 6 automated install XML must run the migrate helper included in the download before headless install. See [[Upgrading_Obsidian#Migrating_saved_automated_install_XML_.28Obsidian_6_.E2.86.92_7.29|Upgrading Obsidian]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Embedded Tomcat quick start&#039;&#039;&#039; — Jetty quick-start pack removed; evaluation and local runs now use Apache Tomcat 10.1.x embedded runtime (Jakarta Servlet 5). The release zip includes &#039;&#039;&#039;h2-tomcat-quick-start.xml&#039;&#039;&#039; as a ready-to-use sample. Four installer deployment profiles are available: Obsidian WAR, Obsidian Embedded Tomcat JAR, Obsidian Standalone Admin WAR, and Obsidian Standalone Admin Embedded Tomcat JAR. See [[Installation_Guide#Deployment_options|Deployment options]] and [[Installation_Guide#Starting_embedded_Tomcat|Starting embedded Tomcat]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Global parameter autocomplete and tooltips&#039;&#039;&#039; — While editing a job, typing &#039;&#039;{{&#039;&#039; in a parameter value opens suggestions for global parameter names (subject to visibility settings). On job view, hover over values containing &#039;&#039;Name&#039;&#039; to see resolved global values when your user&#039;s permissions allow. Administration screens for defining global parameters are unchanged. See [[Advanced_Configuration|Advanced Configuration]] for visibility settings.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Install-time dependency resolution&#039;&#039;&#039; — The published installer download does not embed public open-source JARs. Libraries are fetched (or read from a pre-staged cache) when you run the installer. See [[Installation_Guide#Offline_or_restricted-network_install|Offline install]] for air-gapped preparation steps.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Modular Groovy and Flexmark libraries&#039;&#039;&#039; — Obsidian no longer ships &#039;&#039;&#039;apache-groovy-all-4.0.24.jar&#039;&#039;&#039; or &#039;&#039;&#039;flexmark-util-0.62.2.jar&#039;&#039;&#039; uber archives. Scripting and UI documentation rendering use the modular JAR sets documented in [[Advanced_Configuration#Dependent_Libraries|Dependent Libraries]].&lt;br /&gt;
&lt;br /&gt;
=== Removals ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Remember Me login option removed&#039;&#039;&#039; — The Remember Me checkbox and associated session-cookie mechanism have been removed. The &#039;&#039;USER_COOKIE&#039;&#039; table and &#039;&#039;allowRememberMe&#039;&#039; system parameter are removed automatically during the upgrade to 7.0.0; no operator action is required.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;User logout&#039;&#039;&#039; - Fixed an issue where users were not fully logged out in certain session states.&lt;br /&gt;
* &#039;&#039;&#039;Job edit screen accessible to users with no roles&#039;&#039;&#039; — Users with no assigned roles could previously access the job edit screen but not make changes; this has been corrected.&lt;br /&gt;
* &#039;&#039;&#039;Firefox UI icons&#039;&#039;&#039; — Fixed icons not rendering correctly in Firefox.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.4.0 ==&lt;br /&gt;
Released December 2025&lt;br /&gt;
&lt;br /&gt;
=== Enhancements === &lt;br /&gt;
* New [[Built-in_Jobs#Obsidian_Execution_Statistics_Job|Execution Statistics Job]] and built in [[Admin_Job_Stats|UI]] and [[Embedded_API#List_Stats|Embedded API]] and [[REST_Endpoints#GET_a_list_of_job_execution_statistics|REST API]]&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Fixed issue preventing [[Admin_Jobs#Deleting|job deletion]] when resubmissions of failed executions existed. Bug existed in UI and APIs.&lt;br /&gt;
* Fixed UI styling issue for [[Admin_Jobs#Deleting|job deletion]] where checkbox label did not appear.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.3 ==&lt;br /&gt;
Released November 2025&lt;br /&gt;
&lt;br /&gt;
=== Enhancements === &lt;br /&gt;
* [https://web.obsidianscheduler.com/obsidianapi/com/carfey/suite/security/LdapAuthenticator.html LDAPAuthenticator] supports configurable check user active override - com.carfey.suite.security.LdapAuthenticator.checkActiveAttribute&lt;br /&gt;
* [https://web.obsidianscheduler.com/obsidianapi/com/carfey/suite/security/LdapAuthenticator.html#isUserActive(javax.naming.directory.DirContext,java.lang.String) LDAPAuthenticator.isUserActive(DirContext,String)] visibility increased to protected to allow for functionality override in subclasses.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Correct LdapAuthenticator case with delimited configuration where active check wasn&#039;t applied.&lt;br /&gt;
* [https://web.obsidianscheduler.com/obsidianapi/com/carfey/suite/security/LdapAuthenticator.html#isUserActive(javax.naming.directory.DirContext,java.lang.String) LDAPAuthenticator.isUserActive(DirContext,String)] javadoc added for isUserActive fully detailing the implementation.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.2 ==&lt;br /&gt;
Released October 2025&lt;br /&gt;
&lt;br /&gt;
=== Enhancements === &lt;br /&gt;
* Notification failures now trigger Dispatch category Error level event on first failure. For use in log alerts and Event Hooks.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Notification failures no longer log on every failure reducing chatty failure logs.&lt;br /&gt;
* No-arg constructors added to multiple JSON serializable candidate POJOs missing them. Addresses GSON&#039;s workaround use of sun.misc.Unsafe.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.1 ==&lt;br /&gt;
Released August 2025&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Fix failure response codes on [[REST_Endpoints#GET_health_details_on_an_existing_scheduling_host|REST health endpoint]]&lt;br /&gt;
* Fix automatic upgrade issue from 6.1.0 to any of 6.2.0, 6.2.1, 6.3.0&lt;br /&gt;
* Fix auth issue when [[Admin_User_Management#Multi-Factor_Authentication_.28MFA.29|MFA]] is enabled that allows REST access when account has been locked out due to MFA not being setup.  [[Contact_the_Obsidian_Scheduler_Team|Contact us]] if you need workaround details for earlier versions.&lt;br /&gt;
* Fix native auth issue that allows REST access when account has been flagged as inactive.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.0 ==&lt;br /&gt;
Released July 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Cron day of month expansion for [[Cron#Special_Character_Usage|day of week proximity]] using [[Cron#Examples|~]]&lt;br /&gt;
* Annotation based job and chain configuration [[Initializing_and_Restoring#Annotation_Initialization|initialization]]&lt;br /&gt;
* Health endpoint with details for Job Queuer and Job Spawner - [[REST_Endpoints#GET_health_details_on_an_existing_scheduling_host|REST API]] or Embedded API [https://web.obsidianscheduler.com/obsidianapi/com/carfey/ops/api/embedded/HostManager.html#getHealth(java.lang.String) by hostname] or [https://web.obsidianscheduler.com/obsidianapi/com/carfey/ops/api/embedded/HostManager.html#getHealth(long) by host id]&lt;br /&gt;
* JDBC URL construction from parts [[Advanced_Configuration#Database_Properties|host/port/databaseName/dbType/oracleSid]]&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.2.1 ==&lt;br /&gt;
Released June 2025&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Certain recoveries greater than 24 hours using new day of month proximity patterns introduced in 6.2.0 would result in no jobs spawning.&lt;br /&gt;
* Migrations targeting 6.0.0 and greater that start earlier than 5.0.0 skip the 5.0.0 migration. Migrating to any 5.x version first and then to 6.0.0 or later works around this issue.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.2.0 ==&lt;br /&gt;
Released May 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Cron day of month expansion for [[Cron#Special_Character_Usage|day of week proximity]] using [[Cron#Examples|&amp;lt; &amp;gt; ≥ ≤]]&lt;br /&gt;
* Cron day of month expansion for [[Cron#Special_Character_Usage|weekday proximity]] using [[Cron#Examples|&amp;lt; &amp;gt; ≥ ≤]]&lt;br /&gt;
* [[Admin_Global_Parameters#Using_Global_Parameters_in_Jobs|Global Parameters]] reference in job edit page support mouseover/title display of actual value when permissions allow&lt;br /&gt;
* Host time displayed in [[Admin_Host_Status|hosts status]] in UI&lt;br /&gt;
* [[Admin_Job_Runtime_Preview|Runtime Preview]] optimizations for large date ranges in both UI and APIs.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Combination of table prefix, sorting by clob column and Oracle metadata load failure no longer results in sql error. This occurred in the UI when viewing raw job history results and in API calls for job runtime results.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.1.1 ==&lt;br /&gt;
Released March 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Authenticator#Implementation_of_a_Custom_Authenticator|Authenticator]] supports optional &amp;lt;code&amp;gt;authenticateREST()&amp;lt;/code&amp;gt; method.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication REST logins do not apply &#039;last login&#039; timestamps. Avoids noisy error that was appearing in logs.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.1.0 ==&lt;br /&gt;
Released March 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication now disables users after 4 invalid login attempts, either password or MFA code if applicable. Invalid attempts threshold is configurable.&lt;br /&gt;
* Native authentication last login datetime displayed on list user screen.&lt;br /&gt;
* Stronger licensing controls. Site and hardware licenses as of this version must be regenerated by Carfey Software and every 2 years. Contact us at licensing [[Image:atSymbol.png]] obsidianscheduler.com.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication password complexity pattern properly created and no longer overwritten on restart.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.0.1 ==&lt;br /&gt;
Released February 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Built-in_Jobs#File_Archive_Job|File Archive Job]] and [[Built-in_Jobs#File_Scanner_Job|File Scanner Job]] both now support min/max file sizes and minimum age.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication user updates now support long passwords.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.0.0 ==&lt;br /&gt;
Released December 27, 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Jakarta Servlet 5.0&lt;br /&gt;
** Servlet container for Web Admin must support Jakarta Servlet 5.0 (e.g. Tomcat 10, Jetty 11)&lt;br /&gt;
* [[Micronaut_Integration|Micronaut]] integration support&lt;br /&gt;
* [[Advanced_Configuration#Dependent_Libraries|Groovy 4]] support&lt;br /&gt;
* [[Advanced_Configuration#Properties.2FYaml_File|Yaml]] configuration support&amp;lt;ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are using automated installer files from previous releases, you will need to add an additional configuration item to choose between yaml and properties formats in UserInputPanel.0.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;com.izforge.izpack.panels.UserInputPanel id=&amp;quot;UserInputPanel.0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;userInput&amp;gt;&lt;br /&gt;
......snip......&lt;br /&gt;
            &amp;lt;entry key=&amp;quot;config.format&amp;quot; value=&amp;quot;yaml&amp;quot; /&amp;gt;&lt;br /&gt;
OR&lt;br /&gt;
            &amp;lt;entry key=&amp;quot;config.format&amp;quot; value=&amp;quot;properties&amp;quot; /&amp;gt;&lt;br /&gt;
......snip......&lt;br /&gt;
        &amp;lt;/userInput&amp;gt;&lt;br /&gt;
    &amp;lt;/com.izforge.izpack.panels.UserInputPanel&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Native authentication supports customizable [[Admin_Login#Password_Complexity|password complexity]] requirements&lt;br /&gt;
* XML support deprecated across the product including XML UI downloads, XML runner configurations and XML license leases.&lt;br /&gt;
** &#039;&#039;&#039;Starting January 1st 2027, XML license lease requests will stop being processed. All Obsidian instances running using internet-verified licenses (including licence key proxies) will be required to use release 6.0.0 or later as of January 1st 2027.&#039;&#039;&#039;&lt;br /&gt;
** Above noted XML support will be removed in the first Obsidian version released in 2027.&lt;br /&gt;
* License leases use JSON payloads.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.5.1 ==&lt;br /&gt;
Released December 16, 2024&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Admin only (no scheduler) UI no longer generates event hook errors while running nor during shutdown&lt;br /&gt;
* Quick start installer file no longer generates errors during installation&lt;br /&gt;
* A few small web UI enhancements&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.5.0 ==&lt;br /&gt;
Released October 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Event Hooks management available in [[Admin_Host_Status#Event_Hook_Status|UI]], [[Embedded_API#Event_Hook_Resume_or_Pause|Embedded API]] and [[REST_Endpoints#POST_event_hook_pause_or_resume|REST API]].&lt;br /&gt;
* [[Installation_Guide#Additional_configuration_items|Installer]] supports custom add on configurations    &#039;&#039;&#039;Potential breaking change to automated installer files.&#039;&#039;&#039; &amp;lt;ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are using automated installer files from previous releases, you will need to add a new section of xml as of Obsidian 5.5.0 to handle a new UserInputPanel. Immediately after the UserInputPanel.17 closing brace, add the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;com.izforge.izpack.panels.UserInputPanel id=&amp;quot;UserInputPanel.18&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;userInput&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.1&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.2&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.3&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.4&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.5&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.6&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.7&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.8&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.9&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.10&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.11&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.12&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.13&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.14&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.15&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.16&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.17&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.18&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.19&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.20&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.1&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.2&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.3&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.4&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.5&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.6&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.7&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.8&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.9&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.11&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.10&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.12&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.13&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.14&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.15&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.16&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.17&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.18&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.19&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.20&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/userInput&amp;gt;&lt;br /&gt;
&amp;lt;/com.izforge.izpack.panels.UserInputPanel&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Certain Cron expressions that fail to generate text descriptions no longer impact scheduling.&lt;br /&gt;
* Text database columns were previously restricted to maximum length of MySQL implementation. Corrected to validate length via DB implementation.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.4.0 ==&lt;br /&gt;
Released June 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Event Hooks available in [[Embedded_API#List_Event_Hooks|Embedded API]] and [[REST_Endpoints#GET_event_hooks|REST API]].&lt;br /&gt;
* [[Advanced_Configuration#Dependent_Libraries|GSON library]] upgrade to support Java 21&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Oracle identifier no longer too long when using prefixes.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.3.0 ==&lt;br /&gt;
Released March 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* New [[Admin_Host_Status#Event_Hook_Status| Event Hooks Status]] available in the UI.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Some improvements throughout the [[Admin_Web_Application_Guide|Admin Web Application]] for autofocus of fields.&lt;br /&gt;
* Additional classes and interfaces added to [https://web.obsidianscheduler.com/obsidianapi/ javadoc].&lt;br /&gt;
* Some cleanup in [https://web.obsidianscheduler.com/obsidianapi/ javadoc] documenation.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.2.1 == &lt;br /&gt;
Released January 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Built-in_Jobs#Maintenance_Jobs|Maintenance Jobs]] are now scheduled by default in new installations. Can be disabled via [[Advanced_Configuration#Miscellaneous_Properties|Configuration]] property.&lt;br /&gt;
* New [[Event_Hooks#Standard_Output.2FError_Streams_Event_Hook | Standard Output/Error Streams Event Hook]].&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Schedule descriptions are now updated after edits are applied in all UI screens and APIs.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.2.0 ==&lt;br /&gt;
Released December 2023&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Cron]] &amp;amp; [[Cron#Recurrence|Recur]] patterns along with any use of [[Admin_Schedule_Aliases|Schedule Aliases]] now support plain language description of the patterns throughout the [[Admin_Web_Application_Guide|UI]], visible while hovering patterns, and in [[REST_Endpoints|REST]] and [[Embedded_API|Embedded]] API responses.&lt;br /&gt;
* All screens supporting UI exports now support JSON ([[Admin_Job_Activity#Exporting_Results|Job Activity]], [[Admin_Jobs#Exporting_Results|Jobs]], [[Admin_Job_Runtime_Preview#Exporting_Results|Runtime Previews]], [[Admin_Job_Chains#Job_Chain_Listing|Job Chains]], [[Admin_Logs#Exporting_Results|Logs]], [[Admin_Notifications#Exporting_Results|Sent Notifications]], [[Admin_User_Management#Exporting_Results|Users]], [[Admin_Custom_Calendars#Calendar_Listing|Calendars]])&lt;br /&gt;
* All screens supporting UI exports and search criteria and/or inline filters now include any specified search criteria and filter text in Excel, XML and JSON downloads ([[Admin_Job_Activity#Exporting_Results|Job Activity]], [[Admin_Jobs#Exporting_Results|Jobs]], [[Admin_Job_Runtime_Preview#Exporting_Results|Runtime Previews]], [[Admin_Job_Chains#Job_Chain_Listing|Job Chains]], [[Admin_Logs#Exporting_Results|Logs]], [[Admin_Notifications#Exporting_Results|Sent Notifications]], [[Admin_User_Management#Exporting_Results|Users]])&lt;br /&gt;
* Support for [[Installation_Guide#Choosing_Email_Support|Jakarta EE mail]] &#039;&#039;&#039;Potential breaking change to automated installer files.&#039;&#039;&#039; &amp;lt;ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are using automated installer files from previous releases and had email configured, you will need to add a new section of xml as of Obsidian 5.2.0 to handle a new UserInputPanel. Immediately after the UserInputPanel.16 closing brace, add the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;com.izforge.izpack.panels.UserInputPanel id=&amp;quot;UserInputPanel.17&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;userInput&amp;gt;&lt;br /&gt;
        &amp;lt;entry key=&amp;quot;mail.type.selection&amp;quot; value=&amp;quot;javax&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/userInput&amp;gt;&lt;br /&gt;
&amp;lt;/com.izforge.izpack.panels.UserInputPanel&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
* New [[Event_Hooks#REST_Endpoint_Event_Hook|REST Endpoint Event Hook]]&lt;br /&gt;
* [[Key_Server_Proxy|Key Server proxy]] artifact obtained via web download during installation&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Time picker buttons (hour, minute, AM/PM) in [[Admin_Job_Activity#Filtering|Job Activity filtering]] no longer change other elements of the selected time.&lt;br /&gt;
* Cron pattern with [[Cron#Special_Character_Usage|LW]] and any other non-L value in day position no longer also incorrectly evaluates to last day.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.1.1 ==&lt;br /&gt;
Released June 2023&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* [[Authenticator|Native authentication]] no longer fails when user deletes are attempted from the UI.&lt;br /&gt;
* Built in maintenance job [[Built-in_Jobs#Job_History_Cleanup_Job|Job History Cleanup]] no longer leaves deletion candidate CHAIN SKIPPED records in the JOB_HISTORY table in rare circumstances.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.1.0 ==&lt;br /&gt;
Released April 2023&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Admin_Schedule_Aliases#Schedule_Alias_Fragments|Schedule Aliases]] now support fragments for configuration-time substitutions.&lt;br /&gt;
* New convenience job [[Built-in_Jobs#Database_File_Export_Job|Database File Export Job]] for generating basic file extracts from database queries.&lt;br /&gt;
* New convenience job [[Built-in_Jobs#REST_Invocation_Job|REST Invocation Job]] for making simple REST calls and storing results.&lt;br /&gt;
* Performance improvements in job failure handling.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.4 == &lt;br /&gt;
Released February 2022&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.17.1 as fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.17.1 RCE vulnerability] where attackers can modify log4j configuration.&lt;br /&gt;
* Restore missing default log4j2 configuration in installation artifacts.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.3 == &lt;br /&gt;
Released December 2021&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.17.0 as fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.17.0 DOS vulnerability]&lt;br /&gt;
* Fix native login issue showing as inactive on some databases.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.2 == &lt;br /&gt;
Released December 2021&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.16.0 as permanent fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.16.0 RCE vulnerability]&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.1 == &lt;br /&gt;
Released December 2021&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.15.0 as fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.15.0 RCE vulnerability]&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
* Fix sporadic native login issue on some databases.&lt;br /&gt;
* Formatting fix in quick installer file&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.0 == &lt;br /&gt;
Released August 2021.&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Java 11 (minimum Java version)&lt;br /&gt;
* [[Admin_Schedule_Aliases|Schedule Aliases]] including support in [[REST_Endpoints#Schedule_Alias_Endpoints|REST API]] and [[Embedded_API#ScheduleAliasManager_API|Embedded API]]&lt;br /&gt;
* [[Admin_User_Management#Multi-Factor_Authentication_.28MFA.29|MFA Support]] for UI logins&lt;br /&gt;
* New [[Admin_User_Management#User_Rights|Author and Operator]] roles&lt;br /&gt;
* Convention-based role permissions by [[Admin_User_Management#Job_Folder_Rights|root job folder]] for Write, Author and Operator.&amp;lt;ref&amp;gt;&lt;br /&gt;
There is a possibility of a breaking change to Embedded or REST API use due to the need to change the [[Embedded_API#Enumerations|User Role enumeration]] from a Java enum to an enum-style class to support this feature. Bringing in the upgraded Obsidian library and compiling should reveal any such broken use of these enumerations. Needed changes should be minor and self-explanatory.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Bundled Jetty 10.0.2&lt;br /&gt;
* Legacy Embedded API (from Obsidian 1.5) dropped&lt;br /&gt;
* Signal handler disabled by default. Enabled only via [[Advanced_Configuration#Miscellaneous_Properties|configuration]].&lt;br /&gt;
* Many [[Advanced_Configuration#Dependent_Libraries|library upgrades]].&lt;br /&gt;
* UI javascript library updates.&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Release_Notes&amp;diff=4083</id>
		<title>Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Release_Notes&amp;diff=4083"/>
		<updated>2026-07-09T20:17:00Z</updated>

		<summary type="html">&lt;p&gt;Craig: /* Features / Enhancements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Please review our [[Upgrading_Obsidian|Upgrade Instructions]].&lt;br /&gt;
&lt;br /&gt;
Read about our [[Planned_Releases|Planned Releases]].&lt;br /&gt;
&lt;br /&gt;
Looking for old release notes? See [[Release_Notes_-_Older_Releases|Release Notes - Older Releases]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toclimit-2&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obsidian 7.0.0 ==&lt;br /&gt;
&lt;br /&gt;
To Be Released July 2026&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;OAuth 2.0 / OIDC Single Sign-On&#039;&#039;&#039; — Obsidian now supports OAuth 2.0 / OIDC SSO authentication via [[Authenticator#OAuthAuthenticator_(OIDC_SSO)|OAuthAuthenticator]]. Configure any OIDC-compliant identity provider (Keycloak, Microsoft Entra ID, Okta, Auth0, or Generic OIDC) as the login provider. See [[Advanced_Configuration#OAuth_/_OIDC_Authentication_Properties]] for full configuration details.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Bearer JWT authentication for the REST API&#039;&#039;&#039; — REST clients can now authenticate using a signed JWT access token in the &#039;&#039;Authorization: Bearer&#039;&#039; header. See [[Advanced_Configuration#OAuth_/_OIDC_Authentication_Properties]] for configuration.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Installer upgrade (IzPack 5)&#039;&#039;&#039; — Obsidian 7.0.0 ships an IzPack 5-based installer. GUI and headless installs behave as in Obsidian 6 for standard flows. Customers with saved Obsidian 6 automated install XML must run the migrate helper included in the download before headless install. See [[Upgrading_Obsidian#Migrating_saved_automated_install_XML_.28Obsidian_6_.E2.86.92_7.29|Upgrading Obsidian]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Embedded Tomcat quick start&#039;&#039;&#039; — Jetty quick-start pack removed; evaluation and local runs now use Apache Tomcat 10.1.x embedded runtime (Jakarta Servlet 5). The release zip includes &#039;&#039;&#039;h2-tomcat-quick-start.xml&#039;&#039;&#039; as a ready-to-use sample. Four installer deployment profiles are available: Obsidian WAR, Obsidian Embedded Tomcat JAR, Obsidian Standalone Admin WAR, and Obsidian Standalone Admin Embedded Tomcat JAR. See [[Installation_Guide#Deployment_options|Deployment options]] and [[Installation_Guide#Starting_embedded_Tomcat|Starting embedded Tomcat]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Global parameter autocomplete and tooltips&#039;&#039;&#039; — While editing a job, typing &#039;&#039;{{&#039;&#039; in a parameter value opens suggestions for global parameter names (subject to visibility settings). On job view, hover over values containing &#039;&#039;Name&#039;&#039; to see resolved global values when your user&#039;s permissions allow. Administration screens for defining global parameters are unchanged. See [[Advanced_Configuration|Advanced Configuration]] for visibility settings.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Install-time dependency resolution&#039;&#039;&#039; — The published installer download does not embed public open-source JARs. Libraries are fetched (or read from a pre-staged cache) when you run the installer. See [[Installation_Guide#Offline_or_restricted-network_install|Offline install]] for air-gapped preparation steps.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Modular Groovy and Flexmark libraries&#039;&#039;&#039; — Obsidian no longer ships &#039;&#039;&#039;apache-groovy-all-4.0.24.jar&#039;&#039;&#039; or &#039;&#039;&#039;flexmark-util-0.62.2.jar&#039;&#039;&#039; uber archives. Scripting and UI documentation rendering use the modular JAR sets documented in [[Advanced_Configuration#Dependent_Libraries|Dependent Libraries]].&lt;br /&gt;
&lt;br /&gt;
=== Removals ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Remember Me login option removed&#039;&#039;&#039; — The Remember Me checkbox and associated session-cookie mechanism have been removed. The &#039;&#039;USER_COOKIE&#039;&#039; table and &#039;&#039;allowRememberMe&#039;&#039; system parameter are removed automatically during the upgrade to 7.0.0; no operator action is required.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;User logout&#039;&#039;&#039; - Fixed an issue where users were not fully logged out in certain session states.&lt;br /&gt;
* &#039;&#039;&#039;Job edit screen accessible to users with no roles&#039;&#039;&#039; — Users with no assigned roles could previously access the job edit screen but not make changes; this has been corrected.&lt;br /&gt;
* &#039;&#039;&#039;Firefox UI icons&#039;&#039;&#039; — Fixed icons not rendering correctly in Firefox.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.4.0 ==&lt;br /&gt;
Released December 2025&lt;br /&gt;
&lt;br /&gt;
=== Enhancements === &lt;br /&gt;
* New [[Built-in_Jobs#Obsidian_Execution_Statistics_Job|Execution Statistics Job]] and built in [[Admin_Job_Stats|UI]] and [[Embedded_API#List_Stats|Embedded API]] and [[REST_Endpoints#GET_a_list_of_job_execution_statistics|REST API]]&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Fixed issue preventing [[Admin_Jobs#Deleting|job deletion]] when resubmissions of failed executions existed. Bug existed in UI and APIs.&lt;br /&gt;
* Fixed UI styling issue for [[Admin_Jobs#Deleting|job deletion]] where checkbox label did not appear.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.3 ==&lt;br /&gt;
Released November 2025&lt;br /&gt;
&lt;br /&gt;
=== Enhancements === &lt;br /&gt;
* [https://web.obsidianscheduler.com/obsidianapi/com/carfey/suite/security/LdapAuthenticator.html LDAPAuthenticator] supports configurable check user active override - com.carfey.suite.security.LdapAuthenticator.checkActiveAttribute&lt;br /&gt;
* [https://web.obsidianscheduler.com/obsidianapi/com/carfey/suite/security/LdapAuthenticator.html#isUserActive(javax.naming.directory.DirContext,java.lang.String) LDAPAuthenticator.isUserActive(DirContext,String)] visibility increased to protected to allow for functionality override in subclasses.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Correct LdapAuthenticator case with delimited configuration where active check wasn&#039;t applied.&lt;br /&gt;
* [https://web.obsidianscheduler.com/obsidianapi/com/carfey/suite/security/LdapAuthenticator.html#isUserActive(javax.naming.directory.DirContext,java.lang.String) LDAPAuthenticator.isUserActive(DirContext,String)] javadoc added for isUserActive fully detailing the implementation.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.2 ==&lt;br /&gt;
Released October 2025&lt;br /&gt;
&lt;br /&gt;
=== Enhancements === &lt;br /&gt;
* Notification failures now trigger Dispatch category Error level event on first failure. For use in log alerts and Event Hooks.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Notification failures no longer log on every failure reducing chatty failure logs.&lt;br /&gt;
* No-arg constructors added to multiple JSON serializable candidate POJOs missing them. Addresses GSON&#039;s workaround use of sun.misc.Unsafe.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.1 ==&lt;br /&gt;
Released August 2025&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Fix failure response codes on [[REST_Endpoints#GET_health_details_on_an_existing_scheduling_host|REST health endpoint]]&lt;br /&gt;
* Fix automatic upgrade issue from 6.1.0 to any of 6.2.0, 6.2.1, 6.3.0&lt;br /&gt;
* Fix auth issue when [[Admin_User_Management#Multi-Factor_Authentication_.28MFA.29|MFA]] is enabled that allows REST access when account has been locked out due to MFA not being setup.  [[Contact_the_Obsidian_Scheduler_Team|Contact us]] if you need workaround details for earlier versions.&lt;br /&gt;
* Fix native auth issue that allows REST access when account has been flagged as inactive.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.0 ==&lt;br /&gt;
Released July 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Cron day of month expansion for [[Cron#Special_Character_Usage|day of week proximity]] using [[Cron#Examples|~]]&lt;br /&gt;
* Annotation based job and chain configuration [[Initializing_and_Restoring#Annotation_Initialization|initialization]]&lt;br /&gt;
* Health endpoint with details for Job Queuer and Job Spawner - [[REST_Endpoints#GET_health_details_on_an_existing_scheduling_host|REST API]] or Embedded API [https://web.obsidianscheduler.com/obsidianapi/com/carfey/ops/api/embedded/HostManager.html#getHealth(java.lang.String) by hostname] or [https://web.obsidianscheduler.com/obsidianapi/com/carfey/ops/api/embedded/HostManager.html#getHealth(long) by host id]&lt;br /&gt;
* JDBC URL construction from parts [[Advanced_Configuration#Database_Properties|host/port/databaseName/dbType/oracleSid]]&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.2.1 ==&lt;br /&gt;
Released June 2025&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Certain recoveries greater than 24 hours using new day of month proximity patterns introduced in 6.2.0 would result in no jobs spawning.&lt;br /&gt;
* Migrations targeting 6.0.0 and greater that start earlier than 5.0.0 skip the 5.0.0 migration. Migrating to any 5.x version first and then to 6.0.0 or later works around this issue.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.2.0 ==&lt;br /&gt;
Released May 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Cron day of month expansion for [[Cron#Special_Character_Usage|day of week proximity]] using [[Cron#Examples|&amp;lt; &amp;gt; ≥ ≤]]&lt;br /&gt;
* Cron day of month expansion for [[Cron#Special_Character_Usage|weekday proximity]] using [[Cron#Examples|&amp;lt; &amp;gt; ≥ ≤]]&lt;br /&gt;
* [[Admin_Global_Parameters#Using_Global_Parameters_in_Jobs|Global Parameters]] reference in job edit page support mouseover/title display of actual value when permissions allow&lt;br /&gt;
* Host time displayed in [[Admin_Host_Status|hosts status]] in UI&lt;br /&gt;
* [[Admin_Job_Runtime_Preview|Runtime Preview]] optimizations for large date ranges in both UI and APIs.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Combination of table prefix, sorting by clob column and Oracle metadata load failure no longer results in sql error. This occurred in the UI when viewing raw job history results and in API calls for job runtime results.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.1.1 ==&lt;br /&gt;
Released March 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Authenticator#Implementation_of_a_Custom_Authenticator|Authenticator]] supports optional &amp;lt;code&amp;gt;authenticateREST()&amp;lt;/code&amp;gt; method.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication REST logins do not apply &#039;last login&#039; timestamps. Avoids noisy error that was appearing in logs.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.1.0 ==&lt;br /&gt;
Released March 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication now disables users after 4 invalid login attempts, either password or MFA code if applicable. Invalid attempts threshold is configurable.&lt;br /&gt;
* Native authentication last login datetime displayed on list user screen.&lt;br /&gt;
* Stronger licensing controls. Site and hardware licenses as of this version must be regenerated by Carfey Software and every 2 years. Contact us at licensing [[Image:atSymbol.png]] obsidianscheduler.com.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication password complexity pattern properly created and no longer overwritten on restart.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.0.1 ==&lt;br /&gt;
Released February 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Built-in_Jobs#File_Archive_Job|File Archive Job]] and [[Built-in_Jobs#File_Scanner_Job|File Scanner Job]] both now support min/max file sizes and minimum age.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication user updates now support long passwords.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.0.0 ==&lt;br /&gt;
Released December 27, 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Jakarta Servlet 5.0&lt;br /&gt;
** Servlet container for Web Admin must support Jakarta Servlet 5.0 (e.g. Tomcat 10, Jetty 11)&lt;br /&gt;
* [[Micronaut_Integration|Micronaut]] integration support&lt;br /&gt;
* [[Advanced_Configuration#Dependent_Libraries|Groovy 4]] support&lt;br /&gt;
* [[Advanced_Configuration#Properties.2FYaml_File|Yaml]] configuration support&amp;lt;ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are using automated installer files from previous releases, you will need to add an additional configuration item to choose between yaml and properties formats in UserInputPanel.0.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;com.izforge.izpack.panels.UserInputPanel id=&amp;quot;UserInputPanel.0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;userInput&amp;gt;&lt;br /&gt;
......snip......&lt;br /&gt;
            &amp;lt;entry key=&amp;quot;config.format&amp;quot; value=&amp;quot;yaml&amp;quot; /&amp;gt;&lt;br /&gt;
OR&lt;br /&gt;
            &amp;lt;entry key=&amp;quot;config.format&amp;quot; value=&amp;quot;properties&amp;quot; /&amp;gt;&lt;br /&gt;
......snip......&lt;br /&gt;
        &amp;lt;/userInput&amp;gt;&lt;br /&gt;
    &amp;lt;/com.izforge.izpack.panels.UserInputPanel&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Native authentication supports customizable [[Admin_Login#Password_Complexity|password complexity]] requirements&lt;br /&gt;
* XML support deprecated across the product including XML UI downloads, XML runner configurations and XML license leases.&lt;br /&gt;
** &#039;&#039;&#039;Starting January 1st 2027, XML license lease requests will stop being processed. All Obsidian instances running using internet-verified licenses (including licence key proxies) will be required to use release 6.0.0 or later as of January 1st 2027.&#039;&#039;&#039;&lt;br /&gt;
** Above noted XML support will be removed in the first Obsidian version released in 2027.&lt;br /&gt;
* License leases use JSON payloads.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.5.1 ==&lt;br /&gt;
Released December 16, 2024&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Admin only (no scheduler) UI no longer generates event hook errors while running nor during shutdown&lt;br /&gt;
* Quick start installer file no longer generates errors during installation&lt;br /&gt;
* A few small web UI enhancements&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.5.0 ==&lt;br /&gt;
Released October 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Event Hooks management available in [[Admin_Host_Status#Event_Hook_Status|UI]], [[Embedded_API#Event_Hook_Resume_or_Pause|Embedded API]] and [[REST_Endpoints#POST_event_hook_pause_or_resume|REST API]].&lt;br /&gt;
* [[Installation_Guide#Additional_configuration_items|Installer]] supports custom add on configurations    &#039;&#039;&#039;Potential breaking change to automated installer files.&#039;&#039;&#039; &amp;lt;ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are using automated installer files from previous releases, you will need to add a new section of xml as of Obsidian 5.5.0 to handle a new UserInputPanel. Immediately after the UserInputPanel.17 closing brace, add the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;com.izforge.izpack.panels.UserInputPanel id=&amp;quot;UserInputPanel.18&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;userInput&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.1&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.2&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.3&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.4&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.5&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.6&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.7&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.8&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.9&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.10&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.11&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.12&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.13&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.14&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.15&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.16&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.17&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.18&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.19&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.20&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.1&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.2&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.3&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.4&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.5&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.6&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.7&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.8&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.9&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.11&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.10&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.12&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.13&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.14&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.15&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.16&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.17&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.18&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.19&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.20&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/userInput&amp;gt;&lt;br /&gt;
&amp;lt;/com.izforge.izpack.panels.UserInputPanel&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Certain Cron expressions that fail to generate text descriptions no longer impact scheduling.&lt;br /&gt;
* Text database columns were previously restricted to maximum length of MySQL implementation. Corrected to validate length via DB implementation.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.4.0 ==&lt;br /&gt;
Released June 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Event Hooks available in [[Embedded_API#List_Event_Hooks|Embedded API]] and [[REST_Endpoints#GET_event_hooks|REST API]].&lt;br /&gt;
* [[Advanced_Configuration#Dependent_Libraries|GSON library]] upgrade to support Java 21&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Oracle identifier no longer too long when using prefixes.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.3.0 ==&lt;br /&gt;
Released March 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* New [[Admin_Host_Status#Event_Hook_Status| Event Hooks Status]] available in the UI.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Some improvements throughout the [[Admin_Web_Application_Guide|Admin Web Application]] for autofocus of fields.&lt;br /&gt;
* Additional classes and interfaces added to [https://web.obsidianscheduler.com/obsidianapi/ javadoc].&lt;br /&gt;
* Some cleanup in [https://web.obsidianscheduler.com/obsidianapi/ javadoc] documenation.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.2.1 == &lt;br /&gt;
Released January 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Built-in_Jobs#Maintenance_Jobs|Maintenance Jobs]] are now scheduled by default in new installations. Can be disabled via [[Advanced_Configuration#Miscellaneous_Properties|Configuration]] property.&lt;br /&gt;
* New [[Event_Hooks#Standard_Output.2FError_Streams_Event_Hook | Standard Output/Error Streams Event Hook]].&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Schedule descriptions are now updated after edits are applied in all UI screens and APIs.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.2.0 ==&lt;br /&gt;
Released December 2023&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Cron]] &amp;amp; [[Cron#Recurrence|Recur]] patterns along with any use of [[Admin_Schedule_Aliases|Schedule Aliases]] now support plain language description of the patterns throughout the [[Admin_Web_Application_Guide|UI]], visible while hovering patterns, and in [[REST_Endpoints|REST]] and [[Embedded_API|Embedded]] API responses.&lt;br /&gt;
* All screens supporting UI exports now support JSON ([[Admin_Job_Activity#Exporting_Results|Job Activity]], [[Admin_Jobs#Exporting_Results|Jobs]], [[Admin_Job_Runtime_Preview#Exporting_Results|Runtime Previews]], [[Admin_Job_Chains#Job_Chain_Listing|Job Chains]], [[Admin_Logs#Exporting_Results|Logs]], [[Admin_Notifications#Exporting_Results|Sent Notifications]], [[Admin_User_Management#Exporting_Results|Users]], [[Admin_Custom_Calendars#Calendar_Listing|Calendars]])&lt;br /&gt;
* All screens supporting UI exports and search criteria and/or inline filters now include any specified search criteria and filter text in Excel, XML and JSON downloads ([[Admin_Job_Activity#Exporting_Results|Job Activity]], [[Admin_Jobs#Exporting_Results|Jobs]], [[Admin_Job_Runtime_Preview#Exporting_Results|Runtime Previews]], [[Admin_Job_Chains#Job_Chain_Listing|Job Chains]], [[Admin_Logs#Exporting_Results|Logs]], [[Admin_Notifications#Exporting_Results|Sent Notifications]], [[Admin_User_Management#Exporting_Results|Users]])&lt;br /&gt;
* Support for [[Installation_Guide#Choosing_Email_Support|Jakarta EE mail]] &#039;&#039;&#039;Potential breaking change to automated installer files.&#039;&#039;&#039; &amp;lt;ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are using automated installer files from previous releases and had email configured, you will need to add a new section of xml as of Obsidian 5.2.0 to handle a new UserInputPanel. Immediately after the UserInputPanel.16 closing brace, add the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;com.izforge.izpack.panels.UserInputPanel id=&amp;quot;UserInputPanel.17&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;userInput&amp;gt;&lt;br /&gt;
        &amp;lt;entry key=&amp;quot;mail.type.selection&amp;quot; value=&amp;quot;javax&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/userInput&amp;gt;&lt;br /&gt;
&amp;lt;/com.izforge.izpack.panels.UserInputPanel&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
* New [[Event_Hooks#REST_Endpoint_Event_Hook|REST Endpoint Event Hook]]&lt;br /&gt;
* [[Key_Server_Proxy|Key Server proxy]] artifact obtained via web download during installation&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Time picker buttons (hour, minute, AM/PM) in [[Admin_Job_Activity#Filtering|Job Activity filtering]] no longer change other elements of the selected time.&lt;br /&gt;
* Cron pattern with [[Cron#Special_Character_Usage|LW]] and any other non-L value in day position no longer also incorrectly evaluates to last day.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.1.1 ==&lt;br /&gt;
Released June 2023&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* [[Authenticator|Native authentication]] no longer fails when user deletes are attempted from the UI.&lt;br /&gt;
* Built in maintenance job [[Built-in_Jobs#Job_History_Cleanup_Job|Job History Cleanup]] no longer leaves deletion candidate CHAIN SKIPPED records in the JOB_HISTORY table in rare circumstances.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.1.0 ==&lt;br /&gt;
Released April 2023&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Admin_Schedule_Aliases#Schedule_Alias_Fragments|Schedule Aliases]] now support fragments for configuration-time substitutions.&lt;br /&gt;
* New convenience job [[Built-in_Jobs#Database_File_Export_Job|Database File Export Job]] for generating basic file extracts from database queries.&lt;br /&gt;
* New convenience job [[Built-in_Jobs#REST_Invocation_Job|REST Invocation Job]] for making simple REST calls and storing results.&lt;br /&gt;
* Performance improvements in job failure handling.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.4 == &lt;br /&gt;
Released February 2022&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.17.1 as fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.17.1 RCE vulnerability] where attackers can modify log4j configuration.&lt;br /&gt;
* Restore missing default log4j2 configuration in installation artifacts.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.3 == &lt;br /&gt;
Released December 2021&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.17.0 as fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.17.0 DOS vulnerability]&lt;br /&gt;
* Fix native login issue showing as inactive on some databases.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.2 == &lt;br /&gt;
Released December 2021&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.16.0 as permanent fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.16.0 RCE vulnerability]&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.1 == &lt;br /&gt;
Released December 2021&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.15.0 as fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.15.0 RCE vulnerability]&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
* Fix sporadic native login issue on some databases.&lt;br /&gt;
* Formatting fix in quick installer file&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.0 == &lt;br /&gt;
Released August 2021.&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Java 11 (minimum Java version)&lt;br /&gt;
* [[Admin_Schedule_Aliases|Schedule Aliases]] including support in [[REST_Endpoints#Schedule_Alias_Endpoints|REST API]] and [[Embedded_API#ScheduleAliasManager_API|Embedded API]]&lt;br /&gt;
* [[Admin_User_Management#Multi-Factor_Authentication_.28MFA.29|MFA Support]] for UI logins&lt;br /&gt;
* New [[Admin_User_Management#User_Rights|Author and Operator]] roles&lt;br /&gt;
* Convention-based role permissions by [[Admin_User_Management#Job_Folder_Rights|root job folder]] for Write, Author and Operator.&amp;lt;ref&amp;gt;&lt;br /&gt;
There is a possibility of a breaking change to Embedded or REST API use due to the need to change the [[Embedded_API#Enumerations|User Role enumeration]] from a Java enum to an enum-style class to support this feature. Bringing in the upgraded Obsidian library and compiling should reveal any such broken use of these enumerations. Needed changes should be minor and self-explanatory.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Bundled Jetty 10.0.2&lt;br /&gt;
* Legacy Embedded API (from Obsidian 1.5) dropped&lt;br /&gt;
* Signal handler disabled by default. Enabled only via [[Advanced_Configuration#Miscellaneous_Properties|configuration]].&lt;br /&gt;
* Many [[Advanced_Configuration#Dependent_Libraries|library upgrades]].&lt;br /&gt;
* UI javascript library updates.&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Release_Notes&amp;diff=4082</id>
		<title>Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Release_Notes&amp;diff=4082"/>
		<updated>2026-07-09T20:15:09Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Please review our [[Upgrading_Obsidian|Upgrade Instructions]].&lt;br /&gt;
&lt;br /&gt;
Read about our [[Planned_Releases|Planned Releases]].&lt;br /&gt;
&lt;br /&gt;
Looking for old release notes? See [[Release_Notes_-_Older_Releases|Release Notes - Older Releases]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toclimit-2&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obsidian 7.0.0 ==&lt;br /&gt;
&lt;br /&gt;
To Be Released July 2026&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;OAuth 2.0 / OIDC Single Sign-On&#039;&#039;&#039; — Obsidian now supports OAuth 2.0 / OIDC SSO authentication via [[Authenticator#OAuthAuthenticator_(OIDC_SSO)|OAuthAuthenticator]]. Configure any OIDC-compliant identity provider (Keycloak, Microsoft Entra ID, Okta, Auth0, or Generic OIDC) as the login provider. See [[Advanced_Configuration#OAuth_/_OIDC_Authentication_Properties]] for full configuration details.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Bearer JWT authentication for the REST API&#039;&#039;&#039; — REST clients can now authenticate using a signed JWT access token in the &#039;&#039;Authorization: Bearer&#039;&#039; header. See [[Advanced_Configuration#OAuth_/_OIDC_Authentication_Properties]] for configuration.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Installer upgrade (IzPack 5)&#039;&#039;&#039; — Obsidian 7.0.0 ships an IzPack 5-based installer. GUI and headless installs behave as in Obsidian 6 for standard flows. Customers with saved Obsidian 6 automated install XML must run the migrate helper included in the download before headless install. See [[Upgrading_Obsidian#Migrating_saved_automated_install_XML_.28Obsidian_6_.E2.86.92_7.29|Upgrading Obsidian]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Embedded Tomcat quick start&#039;&#039;&#039; — Jetty quick-start pack removed; evaluation and local runs now use Apache Tomcat 10.1.x embedded runtime (Jakarta Servlet 5). The release zip includes &#039;&#039;&#039;h2-tomcat-quick-start.xml&#039;&#039;&#039; as a ready-to-use sample. Four installer deployment profiles are available: Obsidian WAR, Obsidian Embedded Tomcat JAR, Obsidian Standalone Admin WAR, and Obsidian Standalone Admin Embedded Tomcat JAR. See [[Installation_Guide#Deployment_options|Deployment options]] and [[Installation_Guide#Starting_embedded_Tomcat|Starting embedded Tomcat]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Global parameter autocomplete and tooltips&#039;&#039;&#039; — While editing a job, typing &#039;&#039;{{&#039;&#039; in a parameter value opens suggestions for global parameter names (subject to visibility settings). On job view, hover over values containing &#039;&#039;Name&#039;&#039; to see resolved global values when your site&#039;s visibility rules allow. Administration screens for defining global parameters are unchanged. See [[Advanced_Configuration|Advanced Configuration]] for visibility settings.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Install-time dependency resolution&#039;&#039;&#039; — The published installer download does not embed public open-source JARs. Libraries are fetched (or read from a pre-staged cache) when you run the installer. See [[Installation_Guide#Offline_or_restricted-network_install|Offline install]] for air-gapped preparation steps.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Modular Groovy and Flexmark libraries&#039;&#039;&#039; — Obsidian no longer ships &#039;&#039;&#039;apache-groovy-all-4.0.24.jar&#039;&#039;&#039; or &#039;&#039;&#039;flexmark-util-0.62.2.jar&#039;&#039;&#039; uber archives. Scripting and UI documentation rendering use the modular JAR sets documented in [[Advanced_Configuration#Dependent_Libraries|Dependent Libraries]].&lt;br /&gt;
&lt;br /&gt;
=== Removals ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Remember Me login option removed&#039;&#039;&#039; — The Remember Me checkbox and associated session-cookie mechanism have been removed. The &#039;&#039;USER_COOKIE&#039;&#039; table and &#039;&#039;allowRememberMe&#039;&#039; system parameter are removed automatically during the upgrade to 7.0.0; no operator action is required.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;User logout&#039;&#039;&#039; - Fixed an issue where users were not fully logged out in certain session states.&lt;br /&gt;
* &#039;&#039;&#039;Job edit screen accessible to users with no roles&#039;&#039;&#039; — Users with no assigned roles could previously access the job edit screen but not make changes; this has been corrected.&lt;br /&gt;
* &#039;&#039;&#039;Firefox UI icons&#039;&#039;&#039; — Fixed icons not rendering correctly in Firefox.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.4.0 ==&lt;br /&gt;
Released December 2025&lt;br /&gt;
&lt;br /&gt;
=== Enhancements === &lt;br /&gt;
* New [[Built-in_Jobs#Obsidian_Execution_Statistics_Job|Execution Statistics Job]] and built in [[Admin_Job_Stats|UI]] and [[Embedded_API#List_Stats|Embedded API]] and [[REST_Endpoints#GET_a_list_of_job_execution_statistics|REST API]]&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Fixed issue preventing [[Admin_Jobs#Deleting|job deletion]] when resubmissions of failed executions existed. Bug existed in UI and APIs.&lt;br /&gt;
* Fixed UI styling issue for [[Admin_Jobs#Deleting|job deletion]] where checkbox label did not appear.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.3 ==&lt;br /&gt;
Released November 2025&lt;br /&gt;
&lt;br /&gt;
=== Enhancements === &lt;br /&gt;
* [https://web.obsidianscheduler.com/obsidianapi/com/carfey/suite/security/LdapAuthenticator.html LDAPAuthenticator] supports configurable check user active override - com.carfey.suite.security.LdapAuthenticator.checkActiveAttribute&lt;br /&gt;
* [https://web.obsidianscheduler.com/obsidianapi/com/carfey/suite/security/LdapAuthenticator.html#isUserActive(javax.naming.directory.DirContext,java.lang.String) LDAPAuthenticator.isUserActive(DirContext,String)] visibility increased to protected to allow for functionality override in subclasses.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Correct LdapAuthenticator case with delimited configuration where active check wasn&#039;t applied.&lt;br /&gt;
* [https://web.obsidianscheduler.com/obsidianapi/com/carfey/suite/security/LdapAuthenticator.html#isUserActive(javax.naming.directory.DirContext,java.lang.String) LDAPAuthenticator.isUserActive(DirContext,String)] javadoc added for isUserActive fully detailing the implementation.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.2 ==&lt;br /&gt;
Released October 2025&lt;br /&gt;
&lt;br /&gt;
=== Enhancements === &lt;br /&gt;
* Notification failures now trigger Dispatch category Error level event on first failure. For use in log alerts and Event Hooks.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Notification failures no longer log on every failure reducing chatty failure logs.&lt;br /&gt;
* No-arg constructors added to multiple JSON serializable candidate POJOs missing them. Addresses GSON&#039;s workaround use of sun.misc.Unsafe.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.1 ==&lt;br /&gt;
Released August 2025&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Fix failure response codes on [[REST_Endpoints#GET_health_details_on_an_existing_scheduling_host|REST health endpoint]]&lt;br /&gt;
* Fix automatic upgrade issue from 6.1.0 to any of 6.2.0, 6.2.1, 6.3.0&lt;br /&gt;
* Fix auth issue when [[Admin_User_Management#Multi-Factor_Authentication_.28MFA.29|MFA]] is enabled that allows REST access when account has been locked out due to MFA not being setup.  [[Contact_the_Obsidian_Scheduler_Team|Contact us]] if you need workaround details for earlier versions.&lt;br /&gt;
* Fix native auth issue that allows REST access when account has been flagged as inactive.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.0 ==&lt;br /&gt;
Released July 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Cron day of month expansion for [[Cron#Special_Character_Usage|day of week proximity]] using [[Cron#Examples|~]]&lt;br /&gt;
* Annotation based job and chain configuration [[Initializing_and_Restoring#Annotation_Initialization|initialization]]&lt;br /&gt;
* Health endpoint with details for Job Queuer and Job Spawner - [[REST_Endpoints#GET_health_details_on_an_existing_scheduling_host|REST API]] or Embedded API [https://web.obsidianscheduler.com/obsidianapi/com/carfey/ops/api/embedded/HostManager.html#getHealth(java.lang.String) by hostname] or [https://web.obsidianscheduler.com/obsidianapi/com/carfey/ops/api/embedded/HostManager.html#getHealth(long) by host id]&lt;br /&gt;
* JDBC URL construction from parts [[Advanced_Configuration#Database_Properties|host/port/databaseName/dbType/oracleSid]]&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.2.1 ==&lt;br /&gt;
Released June 2025&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Certain recoveries greater than 24 hours using new day of month proximity patterns introduced in 6.2.0 would result in no jobs spawning.&lt;br /&gt;
* Migrations targeting 6.0.0 and greater that start earlier than 5.0.0 skip the 5.0.0 migration. Migrating to any 5.x version first and then to 6.0.0 or later works around this issue.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.2.0 ==&lt;br /&gt;
Released May 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Cron day of month expansion for [[Cron#Special_Character_Usage|day of week proximity]] using [[Cron#Examples|&amp;lt; &amp;gt; ≥ ≤]]&lt;br /&gt;
* Cron day of month expansion for [[Cron#Special_Character_Usage|weekday proximity]] using [[Cron#Examples|&amp;lt; &amp;gt; ≥ ≤]]&lt;br /&gt;
* [[Admin_Global_Parameters#Using_Global_Parameters_in_Jobs|Global Parameters]] reference in job edit page support mouseover/title display of actual value when permissions allow&lt;br /&gt;
* Host time displayed in [[Admin_Host_Status|hosts status]] in UI&lt;br /&gt;
* [[Admin_Job_Runtime_Preview|Runtime Preview]] optimizations for large date ranges in both UI and APIs.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Combination of table prefix, sorting by clob column and Oracle metadata load failure no longer results in sql error. This occurred in the UI when viewing raw job history results and in API calls for job runtime results.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.1.1 ==&lt;br /&gt;
Released March 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Authenticator#Implementation_of_a_Custom_Authenticator|Authenticator]] supports optional &amp;lt;code&amp;gt;authenticateREST()&amp;lt;/code&amp;gt; method.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication REST logins do not apply &#039;last login&#039; timestamps. Avoids noisy error that was appearing in logs.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.1.0 ==&lt;br /&gt;
Released March 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication now disables users after 4 invalid login attempts, either password or MFA code if applicable. Invalid attempts threshold is configurable.&lt;br /&gt;
* Native authentication last login datetime displayed on list user screen.&lt;br /&gt;
* Stronger licensing controls. Site and hardware licenses as of this version must be regenerated by Carfey Software and every 2 years. Contact us at licensing [[Image:atSymbol.png]] obsidianscheduler.com.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication password complexity pattern properly created and no longer overwritten on restart.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.0.1 ==&lt;br /&gt;
Released February 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Built-in_Jobs#File_Archive_Job|File Archive Job]] and [[Built-in_Jobs#File_Scanner_Job|File Scanner Job]] both now support min/max file sizes and minimum age.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication user updates now support long passwords.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.0.0 ==&lt;br /&gt;
Released December 27, 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Jakarta Servlet 5.0&lt;br /&gt;
** Servlet container for Web Admin must support Jakarta Servlet 5.0 (e.g. Tomcat 10, Jetty 11)&lt;br /&gt;
* [[Micronaut_Integration|Micronaut]] integration support&lt;br /&gt;
* [[Advanced_Configuration#Dependent_Libraries|Groovy 4]] support&lt;br /&gt;
* [[Advanced_Configuration#Properties.2FYaml_File|Yaml]] configuration support&amp;lt;ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are using automated installer files from previous releases, you will need to add an additional configuration item to choose between yaml and properties formats in UserInputPanel.0.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;com.izforge.izpack.panels.UserInputPanel id=&amp;quot;UserInputPanel.0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;userInput&amp;gt;&lt;br /&gt;
......snip......&lt;br /&gt;
            &amp;lt;entry key=&amp;quot;config.format&amp;quot; value=&amp;quot;yaml&amp;quot; /&amp;gt;&lt;br /&gt;
OR&lt;br /&gt;
            &amp;lt;entry key=&amp;quot;config.format&amp;quot; value=&amp;quot;properties&amp;quot; /&amp;gt;&lt;br /&gt;
......snip......&lt;br /&gt;
        &amp;lt;/userInput&amp;gt;&lt;br /&gt;
    &amp;lt;/com.izforge.izpack.panels.UserInputPanel&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Native authentication supports customizable [[Admin_Login#Password_Complexity|password complexity]] requirements&lt;br /&gt;
* XML support deprecated across the product including XML UI downloads, XML runner configurations and XML license leases.&lt;br /&gt;
** &#039;&#039;&#039;Starting January 1st 2027, XML license lease requests will stop being processed. All Obsidian instances running using internet-verified licenses (including licence key proxies) will be required to use release 6.0.0 or later as of January 1st 2027.&#039;&#039;&#039;&lt;br /&gt;
** Above noted XML support will be removed in the first Obsidian version released in 2027.&lt;br /&gt;
* License leases use JSON payloads.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.5.1 ==&lt;br /&gt;
Released December 16, 2024&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Admin only (no scheduler) UI no longer generates event hook errors while running nor during shutdown&lt;br /&gt;
* Quick start installer file no longer generates errors during installation&lt;br /&gt;
* A few small web UI enhancements&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.5.0 ==&lt;br /&gt;
Released October 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Event Hooks management available in [[Admin_Host_Status#Event_Hook_Status|UI]], [[Embedded_API#Event_Hook_Resume_or_Pause|Embedded API]] and [[REST_Endpoints#POST_event_hook_pause_or_resume|REST API]].&lt;br /&gt;
* [[Installation_Guide#Additional_configuration_items|Installer]] supports custom add on configurations    &#039;&#039;&#039;Potential breaking change to automated installer files.&#039;&#039;&#039; &amp;lt;ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are using automated installer files from previous releases, you will need to add a new section of xml as of Obsidian 5.5.0 to handle a new UserInputPanel. Immediately after the UserInputPanel.17 closing brace, add the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;com.izforge.izpack.panels.UserInputPanel id=&amp;quot;UserInputPanel.18&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;userInput&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.1&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.2&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.3&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.4&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.5&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.6&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.7&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.8&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.9&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.10&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.11&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.12&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.13&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.14&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.15&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.16&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.17&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.18&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.19&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.20&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.1&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.2&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.3&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.4&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.5&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.6&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.7&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.8&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.9&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.11&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.10&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.12&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.13&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.14&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.15&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.16&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.17&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.18&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.19&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.20&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/userInput&amp;gt;&lt;br /&gt;
&amp;lt;/com.izforge.izpack.panels.UserInputPanel&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Certain Cron expressions that fail to generate text descriptions no longer impact scheduling.&lt;br /&gt;
* Text database columns were previously restricted to maximum length of MySQL implementation. Corrected to validate length via DB implementation.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.4.0 ==&lt;br /&gt;
Released June 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Event Hooks available in [[Embedded_API#List_Event_Hooks|Embedded API]] and [[REST_Endpoints#GET_event_hooks|REST API]].&lt;br /&gt;
* [[Advanced_Configuration#Dependent_Libraries|GSON library]] upgrade to support Java 21&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Oracle identifier no longer too long when using prefixes.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.3.0 ==&lt;br /&gt;
Released March 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* New [[Admin_Host_Status#Event_Hook_Status| Event Hooks Status]] available in the UI.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Some improvements throughout the [[Admin_Web_Application_Guide|Admin Web Application]] for autofocus of fields.&lt;br /&gt;
* Additional classes and interfaces added to [https://web.obsidianscheduler.com/obsidianapi/ javadoc].&lt;br /&gt;
* Some cleanup in [https://web.obsidianscheduler.com/obsidianapi/ javadoc] documenation.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.2.1 == &lt;br /&gt;
Released January 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Built-in_Jobs#Maintenance_Jobs|Maintenance Jobs]] are now scheduled by default in new installations. Can be disabled via [[Advanced_Configuration#Miscellaneous_Properties|Configuration]] property.&lt;br /&gt;
* New [[Event_Hooks#Standard_Output.2FError_Streams_Event_Hook | Standard Output/Error Streams Event Hook]].&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Schedule descriptions are now updated after edits are applied in all UI screens and APIs.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.2.0 ==&lt;br /&gt;
Released December 2023&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Cron]] &amp;amp; [[Cron#Recurrence|Recur]] patterns along with any use of [[Admin_Schedule_Aliases|Schedule Aliases]] now support plain language description of the patterns throughout the [[Admin_Web_Application_Guide|UI]], visible while hovering patterns, and in [[REST_Endpoints|REST]] and [[Embedded_API|Embedded]] API responses.&lt;br /&gt;
* All screens supporting UI exports now support JSON ([[Admin_Job_Activity#Exporting_Results|Job Activity]], [[Admin_Jobs#Exporting_Results|Jobs]], [[Admin_Job_Runtime_Preview#Exporting_Results|Runtime Previews]], [[Admin_Job_Chains#Job_Chain_Listing|Job Chains]], [[Admin_Logs#Exporting_Results|Logs]], [[Admin_Notifications#Exporting_Results|Sent Notifications]], [[Admin_User_Management#Exporting_Results|Users]], [[Admin_Custom_Calendars#Calendar_Listing|Calendars]])&lt;br /&gt;
* All screens supporting UI exports and search criteria and/or inline filters now include any specified search criteria and filter text in Excel, XML and JSON downloads ([[Admin_Job_Activity#Exporting_Results|Job Activity]], [[Admin_Jobs#Exporting_Results|Jobs]], [[Admin_Job_Runtime_Preview#Exporting_Results|Runtime Previews]], [[Admin_Job_Chains#Job_Chain_Listing|Job Chains]], [[Admin_Logs#Exporting_Results|Logs]], [[Admin_Notifications#Exporting_Results|Sent Notifications]], [[Admin_User_Management#Exporting_Results|Users]])&lt;br /&gt;
* Support for [[Installation_Guide#Choosing_Email_Support|Jakarta EE mail]] &#039;&#039;&#039;Potential breaking change to automated installer files.&#039;&#039;&#039; &amp;lt;ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are using automated installer files from previous releases and had email configured, you will need to add a new section of xml as of Obsidian 5.2.0 to handle a new UserInputPanel. Immediately after the UserInputPanel.16 closing brace, add the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;com.izforge.izpack.panels.UserInputPanel id=&amp;quot;UserInputPanel.17&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;userInput&amp;gt;&lt;br /&gt;
        &amp;lt;entry key=&amp;quot;mail.type.selection&amp;quot; value=&amp;quot;javax&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/userInput&amp;gt;&lt;br /&gt;
&amp;lt;/com.izforge.izpack.panels.UserInputPanel&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
* New [[Event_Hooks#REST_Endpoint_Event_Hook|REST Endpoint Event Hook]]&lt;br /&gt;
* [[Key_Server_Proxy|Key Server proxy]] artifact obtained via web download during installation&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Time picker buttons (hour, minute, AM/PM) in [[Admin_Job_Activity#Filtering|Job Activity filtering]] no longer change other elements of the selected time.&lt;br /&gt;
* Cron pattern with [[Cron#Special_Character_Usage|LW]] and any other non-L value in day position no longer also incorrectly evaluates to last day.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.1.1 ==&lt;br /&gt;
Released June 2023&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* [[Authenticator|Native authentication]] no longer fails when user deletes are attempted from the UI.&lt;br /&gt;
* Built in maintenance job [[Built-in_Jobs#Job_History_Cleanup_Job|Job History Cleanup]] no longer leaves deletion candidate CHAIN SKIPPED records in the JOB_HISTORY table in rare circumstances.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.1.0 ==&lt;br /&gt;
Released April 2023&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Admin_Schedule_Aliases#Schedule_Alias_Fragments|Schedule Aliases]] now support fragments for configuration-time substitutions.&lt;br /&gt;
* New convenience job [[Built-in_Jobs#Database_File_Export_Job|Database File Export Job]] for generating basic file extracts from database queries.&lt;br /&gt;
* New convenience job [[Built-in_Jobs#REST_Invocation_Job|REST Invocation Job]] for making simple REST calls and storing results.&lt;br /&gt;
* Performance improvements in job failure handling.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.4 == &lt;br /&gt;
Released February 2022&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.17.1 as fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.17.1 RCE vulnerability] where attackers can modify log4j configuration.&lt;br /&gt;
* Restore missing default log4j2 configuration in installation artifacts.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.3 == &lt;br /&gt;
Released December 2021&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.17.0 as fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.17.0 DOS vulnerability]&lt;br /&gt;
* Fix native login issue showing as inactive on some databases.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.2 == &lt;br /&gt;
Released December 2021&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.16.0 as permanent fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.16.0 RCE vulnerability]&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.1 == &lt;br /&gt;
Released December 2021&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.15.0 as fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.15.0 RCE vulnerability]&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
* Fix sporadic native login issue on some databases.&lt;br /&gt;
* Formatting fix in quick installer file&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.0 == &lt;br /&gt;
Released August 2021.&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Java 11 (minimum Java version)&lt;br /&gt;
* [[Admin_Schedule_Aliases|Schedule Aliases]] including support in [[REST_Endpoints#Schedule_Alias_Endpoints|REST API]] and [[Embedded_API#ScheduleAliasManager_API|Embedded API]]&lt;br /&gt;
* [[Admin_User_Management#Multi-Factor_Authentication_.28MFA.29|MFA Support]] for UI logins&lt;br /&gt;
* New [[Admin_User_Management#User_Rights|Author and Operator]] roles&lt;br /&gt;
* Convention-based role permissions by [[Admin_User_Management#Job_Folder_Rights|root job folder]] for Write, Author and Operator.&amp;lt;ref&amp;gt;&lt;br /&gt;
There is a possibility of a breaking change to Embedded or REST API use due to the need to change the [[Embedded_API#Enumerations|User Role enumeration]] from a Java enum to an enum-style class to support this feature. Bringing in the upgraded Obsidian library and compiling should reveal any such broken use of these enumerations. Needed changes should be minor and self-explanatory.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Bundled Jetty 10.0.2&lt;br /&gt;
* Legacy Embedded API (from Obsidian 1.5) dropped&lt;br /&gt;
* Signal handler disabled by default. Enabled only via [[Advanced_Configuration#Miscellaneous_Properties|configuration]].&lt;br /&gt;
* Many [[Advanced_Configuration#Dependent_Libraries|library upgrades]].&lt;br /&gt;
* UI javascript library updates.&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Release_Notes&amp;diff=4081</id>
		<title>Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Release_Notes&amp;diff=4081"/>
		<updated>2026-07-09T20:14:28Z</updated>

		<summary type="html">&lt;p&gt;Craig: /* Features / Enhancements */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Please review our [[Upgrading_Obsidian|Upgrade Instructions]].&lt;br /&gt;
&lt;br /&gt;
Read about our [[Planned_Releases|Planned Releases]].&lt;br /&gt;
&lt;br /&gt;
Looking for old release notes? See [[Release_Notes_-_Older_Releases|Release Notes - Older Releases]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toclimit-2&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obsidian 7.0.0 ==&lt;br /&gt;
&lt;br /&gt;
To Be Released July 2026&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;OAuth 2.0 / OIDC Single Sign-On&#039;&#039;&#039; — Obsidian now supports OAuth 2.0 / OIDC SSO authentication via [[Authenticator#OAuthAuthenticator_(OIDC_SSO)|OAuthAuthenticator]]. Configure any OIDC-compliant identity provider (Keycloak, Microsoft Entra ID, Okta, Auth0, or Generic OIDC) as the login provider. See [[Advanced_Configuration#OAuth_/_OIDC_Authentication_Properties]] for full configuration details.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Bearer JWT authentication for the REST API&#039;&#039;&#039; — REST clients can now authenticate using a signed JWT access token in the &#039;&#039;Authorization: Bearer&#039;&#039; header. See [[Advanced_Configuration#OAuth_/_OIDC_Authentication_Properties]] for configuration.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Installer upgrade (IzPack 5)&#039;&#039;&#039; — Obsidian 7.0.0 ships an IzPack 5-based installer. GUI and headless installs behave as in Obsidian 6 for standard flows. Customers with saved Obsidian 6 automated install XML must run the migrate helper included in the download before headless install. See [[Upgrading_Obsidian#Migrating_saved_automated_install_XML_.28Obsidian_6_.E2.86.92_7.29|Upgrading Obsidian]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Embedded Tomcat quick start&#039;&#039;&#039; — Jetty quick-start pack removed; evaluation and local runs now use Apache Tomcat 10.1.x embedded runtime (Jakarta Servlet 5). The release zip includes &#039;&#039;&#039;h2-tomcat-quick-start.xml&#039;&#039;&#039; as a ready-to-use sample. Four installer deployment profiles are available: Obsidian WAR, Obsidian Embedded Tomcat JAR, Obsidian Standalone Admin WAR, and Obsidian Standalone Admin Embedded Tomcat JAR. See [[Installation_Guide#Deployment_options|Deployment options]] and [[Installation_Guide#Starting_embedded_Tomcat|Starting embedded Tomcat]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Global parameter autocomplete and tooltips&#039;&#039;&#039; — While editing a job, typing &#039;&#039;{{&#039;&#039; in a parameter value opens suggestions for global parameter names (subject to visibility settings). On job view, hover over values containing &#039;&#039;Name&#039;&#039; to see resolved global values when your site&#039;s visibility rules allow. Administration screens for defining global parameters are unchanged. See [[Advanced_Configuration|Advanced Configuration]] for visibility settings.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Install-time dependency resolution&#039;&#039;&#039; — The published installer download does not embed public open-source JARs. Libraries are fetched (or read from a pre-staged cache) when you run the installer. See [[Installation_Guide#Offline_or_restricted-network_install|Offline install]] for air-gapped preparation steps.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Modular Groovy and Flexmark libraries&#039;&#039;&#039; — Obsidian no longer ships &#039;&#039;&#039;apache-groovy-all-4.0.24.jar&#039;&#039;&#039; or &#039;&#039;&#039;flexmark-util-0.62.2.jar&#039;&#039;&#039; uber archives. Scripting and UI documentation rendering use the modular JAR sets documented in [[Advanced_Configuration#Dependent_Libraries|Dependent Libraries]].&lt;br /&gt;
&lt;br /&gt;
=== Removals ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Remember Me login option removed&#039;&#039;&#039; — The Remember Me checkbox and associated session-cookie mechanism have been removed. The &#039;&#039;USER_COOKIE&#039;&#039; table and &#039;&#039;allowRememberMe&#039;&#039; system parameter are removed automatically during the upgrade to 7.0.0; no operator action is required.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.4.0 ==&lt;br /&gt;
Released December 2025&lt;br /&gt;
&lt;br /&gt;
=== Enhancements === &lt;br /&gt;
* New [[Built-in_Jobs#Obsidian_Execution_Statistics_Job|Execution Statistics Job]] and built in [[Admin_Job_Stats|UI]] and [[Embedded_API#List_Stats|Embedded API]] and [[REST_Endpoints#GET_a_list_of_job_execution_statistics|REST API]]&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Fixed issue preventing [[Admin_Jobs#Deleting|job deletion]] when resubmissions of failed executions existed. Bug existed in UI and APIs.&lt;br /&gt;
* Fixed UI styling issue for [[Admin_Jobs#Deleting|job deletion]] where checkbox label did not appear.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.3 ==&lt;br /&gt;
Released November 2025&lt;br /&gt;
&lt;br /&gt;
=== Enhancements === &lt;br /&gt;
* [https://web.obsidianscheduler.com/obsidianapi/com/carfey/suite/security/LdapAuthenticator.html LDAPAuthenticator] supports configurable check user active override - com.carfey.suite.security.LdapAuthenticator.checkActiveAttribute&lt;br /&gt;
* [https://web.obsidianscheduler.com/obsidianapi/com/carfey/suite/security/LdapAuthenticator.html#isUserActive(javax.naming.directory.DirContext,java.lang.String) LDAPAuthenticator.isUserActive(DirContext,String)] visibility increased to protected to allow for functionality override in subclasses.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Correct LdapAuthenticator case with delimited configuration where active check wasn&#039;t applied.&lt;br /&gt;
* [https://web.obsidianscheduler.com/obsidianapi/com/carfey/suite/security/LdapAuthenticator.html#isUserActive(javax.naming.directory.DirContext,java.lang.String) LDAPAuthenticator.isUserActive(DirContext,String)] javadoc added for isUserActive fully detailing the implementation.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.2 ==&lt;br /&gt;
Released October 2025&lt;br /&gt;
&lt;br /&gt;
=== Enhancements === &lt;br /&gt;
* Notification failures now trigger Dispatch category Error level event on first failure. For use in log alerts and Event Hooks.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Notification failures no longer log on every failure reducing chatty failure logs.&lt;br /&gt;
* No-arg constructors added to multiple JSON serializable candidate POJOs missing them. Addresses GSON&#039;s workaround use of sun.misc.Unsafe.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.1 ==&lt;br /&gt;
Released August 2025&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Fix failure response codes on [[REST_Endpoints#GET_health_details_on_an_existing_scheduling_host|REST health endpoint]]&lt;br /&gt;
* Fix automatic upgrade issue from 6.1.0 to any of 6.2.0, 6.2.1, 6.3.0&lt;br /&gt;
* Fix auth issue when [[Admin_User_Management#Multi-Factor_Authentication_.28MFA.29|MFA]] is enabled that allows REST access when account has been locked out due to MFA not being setup.  [[Contact_the_Obsidian_Scheduler_Team|Contact us]] if you need workaround details for earlier versions.&lt;br /&gt;
* Fix native auth issue that allows REST access when account has been flagged as inactive.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.0 ==&lt;br /&gt;
Released July 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Cron day of month expansion for [[Cron#Special_Character_Usage|day of week proximity]] using [[Cron#Examples|~]]&lt;br /&gt;
* Annotation based job and chain configuration [[Initializing_and_Restoring#Annotation_Initialization|initialization]]&lt;br /&gt;
* Health endpoint with details for Job Queuer and Job Spawner - [[REST_Endpoints#GET_health_details_on_an_existing_scheduling_host|REST API]] or Embedded API [https://web.obsidianscheduler.com/obsidianapi/com/carfey/ops/api/embedded/HostManager.html#getHealth(java.lang.String) by hostname] or [https://web.obsidianscheduler.com/obsidianapi/com/carfey/ops/api/embedded/HostManager.html#getHealth(long) by host id]&lt;br /&gt;
* JDBC URL construction from parts [[Advanced_Configuration#Database_Properties|host/port/databaseName/dbType/oracleSid]]&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.2.1 ==&lt;br /&gt;
Released June 2025&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Certain recoveries greater than 24 hours using new day of month proximity patterns introduced in 6.2.0 would result in no jobs spawning.&lt;br /&gt;
* Migrations targeting 6.0.0 and greater that start earlier than 5.0.0 skip the 5.0.0 migration. Migrating to any 5.x version first and then to 6.0.0 or later works around this issue.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.2.0 ==&lt;br /&gt;
Released May 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Cron day of month expansion for [[Cron#Special_Character_Usage|day of week proximity]] using [[Cron#Examples|&amp;lt; &amp;gt; ≥ ≤]]&lt;br /&gt;
* Cron day of month expansion for [[Cron#Special_Character_Usage|weekday proximity]] using [[Cron#Examples|&amp;lt; &amp;gt; ≥ ≤]]&lt;br /&gt;
* [[Admin_Global_Parameters#Using_Global_Parameters_in_Jobs|Global Parameters]] reference in job edit page support mouseover/title display of actual value when permissions allow&lt;br /&gt;
* Host time displayed in [[Admin_Host_Status|hosts status]] in UI&lt;br /&gt;
* [[Admin_Job_Runtime_Preview|Runtime Preview]] optimizations for large date ranges in both UI and APIs.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Combination of table prefix, sorting by clob column and Oracle metadata load failure no longer results in sql error. This occurred in the UI when viewing raw job history results and in API calls for job runtime results.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.1.1 ==&lt;br /&gt;
Released March 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Authenticator#Implementation_of_a_Custom_Authenticator|Authenticator]] supports optional &amp;lt;code&amp;gt;authenticateREST()&amp;lt;/code&amp;gt; method.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication REST logins do not apply &#039;last login&#039; timestamps. Avoids noisy error that was appearing in logs.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.1.0 ==&lt;br /&gt;
Released March 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication now disables users after 4 invalid login attempts, either password or MFA code if applicable. Invalid attempts threshold is configurable.&lt;br /&gt;
* Native authentication last login datetime displayed on list user screen.&lt;br /&gt;
* Stronger licensing controls. Site and hardware licenses as of this version must be regenerated by Carfey Software and every 2 years. Contact us at licensing [[Image:atSymbol.png]] obsidianscheduler.com.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication password complexity pattern properly created and no longer overwritten on restart.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.0.1 ==&lt;br /&gt;
Released February 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Built-in_Jobs#File_Archive_Job|File Archive Job]] and [[Built-in_Jobs#File_Scanner_Job|File Scanner Job]] both now support min/max file sizes and minimum age.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication user updates now support long passwords.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.0.0 ==&lt;br /&gt;
Released December 27, 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Jakarta Servlet 5.0&lt;br /&gt;
** Servlet container for Web Admin must support Jakarta Servlet 5.0 (e.g. Tomcat 10, Jetty 11)&lt;br /&gt;
* [[Micronaut_Integration|Micronaut]] integration support&lt;br /&gt;
* [[Advanced_Configuration#Dependent_Libraries|Groovy 4]] support&lt;br /&gt;
* [[Advanced_Configuration#Properties.2FYaml_File|Yaml]] configuration support&amp;lt;ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are using automated installer files from previous releases, you will need to add an additional configuration item to choose between yaml and properties formats in UserInputPanel.0.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;com.izforge.izpack.panels.UserInputPanel id=&amp;quot;UserInputPanel.0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;userInput&amp;gt;&lt;br /&gt;
......snip......&lt;br /&gt;
            &amp;lt;entry key=&amp;quot;config.format&amp;quot; value=&amp;quot;yaml&amp;quot; /&amp;gt;&lt;br /&gt;
OR&lt;br /&gt;
            &amp;lt;entry key=&amp;quot;config.format&amp;quot; value=&amp;quot;properties&amp;quot; /&amp;gt;&lt;br /&gt;
......snip......&lt;br /&gt;
        &amp;lt;/userInput&amp;gt;&lt;br /&gt;
    &amp;lt;/com.izforge.izpack.panels.UserInputPanel&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Native authentication supports customizable [[Admin_Login#Password_Complexity|password complexity]] requirements&lt;br /&gt;
* XML support deprecated across the product including XML UI downloads, XML runner configurations and XML license leases.&lt;br /&gt;
** &#039;&#039;&#039;Starting January 1st 2027, XML license lease requests will stop being processed. All Obsidian instances running using internet-verified licenses (including licence key proxies) will be required to use release 6.0.0 or later as of January 1st 2027.&#039;&#039;&#039;&lt;br /&gt;
** Above noted XML support will be removed in the first Obsidian version released in 2027.&lt;br /&gt;
* License leases use JSON payloads.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.5.1 ==&lt;br /&gt;
Released December 16, 2024&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Admin only (no scheduler) UI no longer generates event hook errors while running nor during shutdown&lt;br /&gt;
* Quick start installer file no longer generates errors during installation&lt;br /&gt;
* A few small web UI enhancements&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.5.0 ==&lt;br /&gt;
Released October 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Event Hooks management available in [[Admin_Host_Status#Event_Hook_Status|UI]], [[Embedded_API#Event_Hook_Resume_or_Pause|Embedded API]] and [[REST_Endpoints#POST_event_hook_pause_or_resume|REST API]].&lt;br /&gt;
* [[Installation_Guide#Additional_configuration_items|Installer]] supports custom add on configurations    &#039;&#039;&#039;Potential breaking change to automated installer files.&#039;&#039;&#039; &amp;lt;ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are using automated installer files from previous releases, you will need to add a new section of xml as of Obsidian 5.5.0 to handle a new UserInputPanel. Immediately after the UserInputPanel.17 closing brace, add the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;com.izforge.izpack.panels.UserInputPanel id=&amp;quot;UserInputPanel.18&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;userInput&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.1&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.2&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.3&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.4&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.5&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.6&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.7&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.8&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.9&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.10&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.11&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.12&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.13&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.14&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.15&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.16&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.17&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.18&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.19&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.20&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.1&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.2&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.3&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.4&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.5&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.6&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.7&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.8&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.9&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.11&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.10&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.12&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.13&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.14&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.15&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.16&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.17&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.18&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.19&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.20&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/userInput&amp;gt;&lt;br /&gt;
&amp;lt;/com.izforge.izpack.panels.UserInputPanel&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Certain Cron expressions that fail to generate text descriptions no longer impact scheduling.&lt;br /&gt;
* Text database columns were previously restricted to maximum length of MySQL implementation. Corrected to validate length via DB implementation.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.4.0 ==&lt;br /&gt;
Released June 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Event Hooks available in [[Embedded_API#List_Event_Hooks|Embedded API]] and [[REST_Endpoints#GET_event_hooks|REST API]].&lt;br /&gt;
* [[Advanced_Configuration#Dependent_Libraries|GSON library]] upgrade to support Java 21&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Oracle identifier no longer too long when using prefixes.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.3.0 ==&lt;br /&gt;
Released March 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* New [[Admin_Host_Status#Event_Hook_Status| Event Hooks Status]] available in the UI.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Some improvements throughout the [[Admin_Web_Application_Guide|Admin Web Application]] for autofocus of fields.&lt;br /&gt;
* Additional classes and interfaces added to [https://web.obsidianscheduler.com/obsidianapi/ javadoc].&lt;br /&gt;
* Some cleanup in [https://web.obsidianscheduler.com/obsidianapi/ javadoc] documenation.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.2.1 == &lt;br /&gt;
Released January 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Built-in_Jobs#Maintenance_Jobs|Maintenance Jobs]] are now scheduled by default in new installations. Can be disabled via [[Advanced_Configuration#Miscellaneous_Properties|Configuration]] property.&lt;br /&gt;
* New [[Event_Hooks#Standard_Output.2FError_Streams_Event_Hook | Standard Output/Error Streams Event Hook]].&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Schedule descriptions are now updated after edits are applied in all UI screens and APIs.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.2.0 ==&lt;br /&gt;
Released December 2023&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Cron]] &amp;amp; [[Cron#Recurrence|Recur]] patterns along with any use of [[Admin_Schedule_Aliases|Schedule Aliases]] now support plain language description of the patterns throughout the [[Admin_Web_Application_Guide|UI]], visible while hovering patterns, and in [[REST_Endpoints|REST]] and [[Embedded_API|Embedded]] API responses.&lt;br /&gt;
* All screens supporting UI exports now support JSON ([[Admin_Job_Activity#Exporting_Results|Job Activity]], [[Admin_Jobs#Exporting_Results|Jobs]], [[Admin_Job_Runtime_Preview#Exporting_Results|Runtime Previews]], [[Admin_Job_Chains#Job_Chain_Listing|Job Chains]], [[Admin_Logs#Exporting_Results|Logs]], [[Admin_Notifications#Exporting_Results|Sent Notifications]], [[Admin_User_Management#Exporting_Results|Users]], [[Admin_Custom_Calendars#Calendar_Listing|Calendars]])&lt;br /&gt;
* All screens supporting UI exports and search criteria and/or inline filters now include any specified search criteria and filter text in Excel, XML and JSON downloads ([[Admin_Job_Activity#Exporting_Results|Job Activity]], [[Admin_Jobs#Exporting_Results|Jobs]], [[Admin_Job_Runtime_Preview#Exporting_Results|Runtime Previews]], [[Admin_Job_Chains#Job_Chain_Listing|Job Chains]], [[Admin_Logs#Exporting_Results|Logs]], [[Admin_Notifications#Exporting_Results|Sent Notifications]], [[Admin_User_Management#Exporting_Results|Users]])&lt;br /&gt;
* Support for [[Installation_Guide#Choosing_Email_Support|Jakarta EE mail]] &#039;&#039;&#039;Potential breaking change to automated installer files.&#039;&#039;&#039; &amp;lt;ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are using automated installer files from previous releases and had email configured, you will need to add a new section of xml as of Obsidian 5.2.0 to handle a new UserInputPanel. Immediately after the UserInputPanel.16 closing brace, add the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;com.izforge.izpack.panels.UserInputPanel id=&amp;quot;UserInputPanel.17&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;userInput&amp;gt;&lt;br /&gt;
        &amp;lt;entry key=&amp;quot;mail.type.selection&amp;quot; value=&amp;quot;javax&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/userInput&amp;gt;&lt;br /&gt;
&amp;lt;/com.izforge.izpack.panels.UserInputPanel&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
* New [[Event_Hooks#REST_Endpoint_Event_Hook|REST Endpoint Event Hook]]&lt;br /&gt;
* [[Key_Server_Proxy|Key Server proxy]] artifact obtained via web download during installation&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Time picker buttons (hour, minute, AM/PM) in [[Admin_Job_Activity#Filtering|Job Activity filtering]] no longer change other elements of the selected time.&lt;br /&gt;
* Cron pattern with [[Cron#Special_Character_Usage|LW]] and any other non-L value in day position no longer also incorrectly evaluates to last day.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.1.1 ==&lt;br /&gt;
Released June 2023&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* [[Authenticator|Native authentication]] no longer fails when user deletes are attempted from the UI.&lt;br /&gt;
* Built in maintenance job [[Built-in_Jobs#Job_History_Cleanup_Job|Job History Cleanup]] no longer leaves deletion candidate CHAIN SKIPPED records in the JOB_HISTORY table in rare circumstances.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.1.0 ==&lt;br /&gt;
Released April 2023&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Admin_Schedule_Aliases#Schedule_Alias_Fragments|Schedule Aliases]] now support fragments for configuration-time substitutions.&lt;br /&gt;
* New convenience job [[Built-in_Jobs#Database_File_Export_Job|Database File Export Job]] for generating basic file extracts from database queries.&lt;br /&gt;
* New convenience job [[Built-in_Jobs#REST_Invocation_Job|REST Invocation Job]] for making simple REST calls and storing results.&lt;br /&gt;
* Performance improvements in job failure handling.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.4 == &lt;br /&gt;
Released February 2022&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.17.1 as fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.17.1 RCE vulnerability] where attackers can modify log4j configuration.&lt;br /&gt;
* Restore missing default log4j2 configuration in installation artifacts.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.3 == &lt;br /&gt;
Released December 2021&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.17.0 as fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.17.0 DOS vulnerability]&lt;br /&gt;
* Fix native login issue showing as inactive on some databases.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.2 == &lt;br /&gt;
Released December 2021&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.16.0 as permanent fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.16.0 RCE vulnerability]&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.1 == &lt;br /&gt;
Released December 2021&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.15.0 as fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.15.0 RCE vulnerability]&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
* Fix sporadic native login issue on some databases.&lt;br /&gt;
* Formatting fix in quick installer file&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.0 == &lt;br /&gt;
Released August 2021.&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Java 11 (minimum Java version)&lt;br /&gt;
* [[Admin_Schedule_Aliases|Schedule Aliases]] including support in [[REST_Endpoints#Schedule_Alias_Endpoints|REST API]] and [[Embedded_API#ScheduleAliasManager_API|Embedded API]]&lt;br /&gt;
* [[Admin_User_Management#Multi-Factor_Authentication_.28MFA.29|MFA Support]] for UI logins&lt;br /&gt;
* New [[Admin_User_Management#User_Rights|Author and Operator]] roles&lt;br /&gt;
* Convention-based role permissions by [[Admin_User_Management#Job_Folder_Rights|root job folder]] for Write, Author and Operator.&amp;lt;ref&amp;gt;&lt;br /&gt;
There is a possibility of a breaking change to Embedded or REST API use due to the need to change the [[Embedded_API#Enumerations|User Role enumeration]] from a Java enum to an enum-style class to support this feature. Bringing in the upgraded Obsidian library and compiling should reveal any such broken use of these enumerations. Needed changes should be minor and self-explanatory.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Bundled Jetty 10.0.2&lt;br /&gt;
* Legacy Embedded API (from Obsidian 1.5) dropped&lt;br /&gt;
* Signal handler disabled by default. Enabled only via [[Advanced_Configuration#Miscellaneous_Properties|configuration]].&lt;br /&gt;
* Many [[Advanced_Configuration#Dependent_Libraries|library upgrades]].&lt;br /&gt;
* UI javascript library updates.&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Release_Notes&amp;diff=4080</id>
		<title>Release Notes</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Release_Notes&amp;diff=4080"/>
		<updated>2026-07-09T20:13:39Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Please review our [[Upgrading_Obsidian|Upgrade Instructions]].&lt;br /&gt;
&lt;br /&gt;
Read about our [[Planned_Releases|Planned Releases]].&lt;br /&gt;
&lt;br /&gt;
Looking for old release notes? See [[Release_Notes_-_Older_Releases|Release Notes - Older Releases]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;toclimit-2&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Obsidian 7.0.0 ==&lt;br /&gt;
&lt;br /&gt;
To Be Released July 2026&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;OAuth 2.0 / OIDC Single Sign-On&#039;&#039;&#039; — Obsidian now supports OAuth 2.0 / OIDC SSO authentication via [[Authenticator#OAuthAuthenticator_(OIDC_SSO)|OAuthAuthenticator]]. Configure any OIDC-compliant identity provider (Keycloak, Microsoft Entra ID, Okta, Auth0, or Generic OIDC) as the login provider. See [[Advanced_Configuration#OAuth_/_OIDC_Authentication_Properties]] for full configuration details.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Bearer JWT authentication for the REST API&#039;&#039;&#039; — REST clients can now authenticate using a signed JWT access token in the &#039;&#039;Authorization: Bearer&#039;&#039; header. See [[Advanced_Configuration#OAuth_/_OIDC_Authentication_Properties]] for configuration.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Installer upgrade (IzPack 5)&#039;&#039;&#039; — Obsidian 7.0.0 ships an IzPack 5-based installer. GUI and headless installs behave as in Obsidian 6 for standard flows. Customers with saved Obsidian 6 automated install XML must run the migrate helper included in the download before headless install. See [[Upgrading_Obsidian#Migrating_saved_automated_install_XML_.28Obsidian_6_.E2.86.92_7.29|Upgrading Obsidian]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Embedded Tomcat quick start&#039;&#039;&#039; — Jetty quick-start pack removed; evaluation and local runs now use Apache Tomcat 10.1.x embedded runtime (Jakarta Servlet 5). The release zip includes &#039;&#039;&#039;h2-tomcat-quick-start.xml&#039;&#039;&#039; as a ready-to-use sample. Four installer deployment profiles are available: Obsidian WAR, Obsidian Embedded Tomcat JAR, Obsidian Standalone Admin WAR, and Obsidian Standalone Admin Embedded Tomcat JAR. See [[Installation_Guide#Deployment_options|Deployment options]] and [[Installation_Guide#Starting_embedded_Tomcat|Starting embedded Tomcat]].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Global parameter autocomplete and tooltips&#039;&#039;&#039; — While editing a job, typing &#039;&#039;{{&#039;&#039; in a parameter value opens suggestions for global parameter names (subject to visibility settings). On job view, hover over values containing &#039;&#039;{{Name}}&#039;&#039; to see resolved global values when your site&#039;s visibility rules allow. Administration screens for defining global parameters are unchanged. See [[Advanced_Configuration|Advanced Configuration]] for visibility settings.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Install-time dependency resolution&#039;&#039;&#039; — The published installer download does not embed public open-source JARs. Libraries are fetched (or read from a pre-staged cache) when you run the installer. See [[Installation_Guide#Offline_or_restricted-network_install|Offline install]] for air-gapped preparation steps.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Modular Groovy and Flexmark libraries&#039;&#039;&#039; — Obsidian no longer ships &#039;&#039;&#039;apache-groovy-all-4.0.24.jar&#039;&#039;&#039; or &#039;&#039;&#039;flexmark-util-0.62.2.jar&#039;&#039;&#039; uber archives. Scripting and UI documentation rendering use the modular JAR sets documented in [[Advanced_Configuration#Dependent_Libraries|Dependent Libraries]].&lt;br /&gt;
&lt;br /&gt;
=== Removals ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Remember Me login option removed&#039;&#039;&#039; — The Remember Me checkbox and associated session-cookie mechanism have been removed. The &#039;&#039;USER_COOKIE&#039;&#039; table and &#039;&#039;allowRememberMe&#039;&#039; system parameter are removed automatically during the upgrade to 7.0.0; no operator action is required.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.4.0 ==&lt;br /&gt;
Released December 2025&lt;br /&gt;
&lt;br /&gt;
=== Enhancements === &lt;br /&gt;
* New [[Built-in_Jobs#Obsidian_Execution_Statistics_Job|Execution Statistics Job]] and built in [[Admin_Job_Stats|UI]] and [[Embedded_API#List_Stats|Embedded API]] and [[REST_Endpoints#GET_a_list_of_job_execution_statistics|REST API]]&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Fixed issue preventing [[Admin_Jobs#Deleting|job deletion]] when resubmissions of failed executions existed. Bug existed in UI and APIs.&lt;br /&gt;
* Fixed UI styling issue for [[Admin_Jobs#Deleting|job deletion]] where checkbox label did not appear.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.3 ==&lt;br /&gt;
Released November 2025&lt;br /&gt;
&lt;br /&gt;
=== Enhancements === &lt;br /&gt;
* [https://web.obsidianscheduler.com/obsidianapi/com/carfey/suite/security/LdapAuthenticator.html LDAPAuthenticator] supports configurable check user active override - com.carfey.suite.security.LdapAuthenticator.checkActiveAttribute&lt;br /&gt;
* [https://web.obsidianscheduler.com/obsidianapi/com/carfey/suite/security/LdapAuthenticator.html#isUserActive(javax.naming.directory.DirContext,java.lang.String) LDAPAuthenticator.isUserActive(DirContext,String)] visibility increased to protected to allow for functionality override in subclasses.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Correct LdapAuthenticator case with delimited configuration where active check wasn&#039;t applied.&lt;br /&gt;
* [https://web.obsidianscheduler.com/obsidianapi/com/carfey/suite/security/LdapAuthenticator.html#isUserActive(javax.naming.directory.DirContext,java.lang.String) LDAPAuthenticator.isUserActive(DirContext,String)] javadoc added for isUserActive fully detailing the implementation.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.2 ==&lt;br /&gt;
Released October 2025&lt;br /&gt;
&lt;br /&gt;
=== Enhancements === &lt;br /&gt;
* Notification failures now trigger Dispatch category Error level event on first failure. For use in log alerts and Event Hooks.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Notification failures no longer log on every failure reducing chatty failure logs.&lt;br /&gt;
* No-arg constructors added to multiple JSON serializable candidate POJOs missing them. Addresses GSON&#039;s workaround use of sun.misc.Unsafe.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.1 ==&lt;br /&gt;
Released August 2025&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Fix failure response codes on [[REST_Endpoints#GET_health_details_on_an_existing_scheduling_host|REST health endpoint]]&lt;br /&gt;
* Fix automatic upgrade issue from 6.1.0 to any of 6.2.0, 6.2.1, 6.3.0&lt;br /&gt;
* Fix auth issue when [[Admin_User_Management#Multi-Factor_Authentication_.28MFA.29|MFA]] is enabled that allows REST access when account has been locked out due to MFA not being setup.  [[Contact_the_Obsidian_Scheduler_Team|Contact us]] if you need workaround details for earlier versions.&lt;br /&gt;
* Fix native auth issue that allows REST access when account has been flagged as inactive.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.3.0 ==&lt;br /&gt;
Released July 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Cron day of month expansion for [[Cron#Special_Character_Usage|day of week proximity]] using [[Cron#Examples|~]]&lt;br /&gt;
* Annotation based job and chain configuration [[Initializing_and_Restoring#Annotation_Initialization|initialization]]&lt;br /&gt;
* Health endpoint with details for Job Queuer and Job Spawner - [[REST_Endpoints#GET_health_details_on_an_existing_scheduling_host|REST API]] or Embedded API [https://web.obsidianscheduler.com/obsidianapi/com/carfey/ops/api/embedded/HostManager.html#getHealth(java.lang.String) by hostname] or [https://web.obsidianscheduler.com/obsidianapi/com/carfey/ops/api/embedded/HostManager.html#getHealth(long) by host id]&lt;br /&gt;
* JDBC URL construction from parts [[Advanced_Configuration#Database_Properties|host/port/databaseName/dbType/oracleSid]]&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.2.1 ==&lt;br /&gt;
Released June 2025&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Certain recoveries greater than 24 hours using new day of month proximity patterns introduced in 6.2.0 would result in no jobs spawning.&lt;br /&gt;
* Migrations targeting 6.0.0 and greater that start earlier than 5.0.0 skip the 5.0.0 migration. Migrating to any 5.x version first and then to 6.0.0 or later works around this issue.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.2.0 ==&lt;br /&gt;
Released May 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Cron day of month expansion for [[Cron#Special_Character_Usage|day of week proximity]] using [[Cron#Examples|&amp;lt; &amp;gt; ≥ ≤]]&lt;br /&gt;
* Cron day of month expansion for [[Cron#Special_Character_Usage|weekday proximity]] using [[Cron#Examples|&amp;lt; &amp;gt; ≥ ≤]]&lt;br /&gt;
* [[Admin_Global_Parameters#Using_Global_Parameters_in_Jobs|Global Parameters]] reference in job edit page support mouseover/title display of actual value when permissions allow&lt;br /&gt;
* Host time displayed in [[Admin_Host_Status|hosts status]] in UI&lt;br /&gt;
* [[Admin_Job_Runtime_Preview|Runtime Preview]] optimizations for large date ranges in both UI and APIs.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Combination of table prefix, sorting by clob column and Oracle metadata load failure no longer results in sql error. This occurred in the UI when viewing raw job history results and in API calls for job runtime results.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.1.1 ==&lt;br /&gt;
Released March 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Authenticator#Implementation_of_a_Custom_Authenticator|Authenticator]] supports optional &amp;lt;code&amp;gt;authenticateREST()&amp;lt;/code&amp;gt; method.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication REST logins do not apply &#039;last login&#039; timestamps. Avoids noisy error that was appearing in logs.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.1.0 ==&lt;br /&gt;
Released March 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication now disables users after 4 invalid login attempts, either password or MFA code if applicable. Invalid attempts threshold is configurable.&lt;br /&gt;
* Native authentication last login datetime displayed on list user screen.&lt;br /&gt;
* Stronger licensing controls. Site and hardware licenses as of this version must be regenerated by Carfey Software and every 2 years. Contact us at licensing [[Image:atSymbol.png]] obsidianscheduler.com.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication password complexity pattern properly created and no longer overwritten on restart.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.0.1 ==&lt;br /&gt;
Released February 2025&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Built-in_Jobs#File_Archive_Job|File Archive Job]] and [[Built-in_Jobs#File_Scanner_Job|File Scanner Job]] both now support min/max file sizes and minimum age.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Native authentication user updates now support long passwords.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 6.0.0 ==&lt;br /&gt;
Released December 27, 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Jakarta Servlet 5.0&lt;br /&gt;
** Servlet container for Web Admin must support Jakarta Servlet 5.0 (e.g. Tomcat 10, Jetty 11)&lt;br /&gt;
* [[Micronaut_Integration|Micronaut]] integration support&lt;br /&gt;
* [[Advanced_Configuration#Dependent_Libraries|Groovy 4]] support&lt;br /&gt;
* [[Advanced_Configuration#Properties.2FYaml_File|Yaml]] configuration support&amp;lt;ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are using automated installer files from previous releases, you will need to add an additional configuration item to choose between yaml and properties formats in UserInputPanel.0.&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;com.izforge.izpack.panels.UserInputPanel id=&amp;quot;UserInputPanel.0&amp;quot;&amp;gt;&lt;br /&gt;
        &amp;lt;userInput&amp;gt;&lt;br /&gt;
......snip......&lt;br /&gt;
            &amp;lt;entry key=&amp;quot;config.format&amp;quot; value=&amp;quot;yaml&amp;quot; /&amp;gt;&lt;br /&gt;
OR&lt;br /&gt;
            &amp;lt;entry key=&amp;quot;config.format&amp;quot; value=&amp;quot;properties&amp;quot; /&amp;gt;&lt;br /&gt;
......snip......&lt;br /&gt;
        &amp;lt;/userInput&amp;gt;&lt;br /&gt;
    &amp;lt;/com.izforge.izpack.panels.UserInputPanel&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Native authentication supports customizable [[Admin_Login#Password_Complexity|password complexity]] requirements&lt;br /&gt;
* XML support deprecated across the product including XML UI downloads, XML runner configurations and XML license leases.&lt;br /&gt;
** &#039;&#039;&#039;Starting January 1st 2027, XML license lease requests will stop being processed. All Obsidian instances running using internet-verified licenses (including licence key proxies) will be required to use release 6.0.0 or later as of January 1st 2027.&#039;&#039;&#039;&lt;br /&gt;
** Above noted XML support will be removed in the first Obsidian version released in 2027.&lt;br /&gt;
* License leases use JSON payloads.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.5.1 ==&lt;br /&gt;
Released December 16, 2024&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Admin only (no scheduler) UI no longer generates event hook errors while running nor during shutdown&lt;br /&gt;
* Quick start installer file no longer generates errors during installation&lt;br /&gt;
* A few small web UI enhancements&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.5.0 ==&lt;br /&gt;
Released October 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Event Hooks management available in [[Admin_Host_Status#Event_Hook_Status|UI]], [[Embedded_API#Event_Hook_Resume_or_Pause|Embedded API]] and [[REST_Endpoints#POST_event_hook_pause_or_resume|REST API]].&lt;br /&gt;
* [[Installation_Guide#Additional_configuration_items|Installer]] supports custom add on configurations    &#039;&#039;&#039;Potential breaking change to automated installer files.&#039;&#039;&#039; &amp;lt;ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are using automated installer files from previous releases, you will need to add a new section of xml as of Obsidian 5.5.0 to handle a new UserInputPanel. Immediately after the UserInputPanel.17 closing brace, add the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;com.izforge.izpack.panels.UserInputPanel id=&amp;quot;UserInputPanel.18&amp;quot;&amp;gt;&lt;br /&gt;
	&amp;lt;userInput&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.1&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.2&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.3&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.4&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.5&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.6&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.7&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.8&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.9&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.10&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.11&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.12&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.13&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.14&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.15&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.16&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.17&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.18&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.19&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.log4j2.properties.20&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.1&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.2&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.3&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.4&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.5&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.6&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.7&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.8&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.9&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.11&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.10&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.12&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.13&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.14&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.15&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.16&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.17&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.18&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.19&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
		&amp;lt;entry key=&amp;quot;extra.carfey.properties.20&amp;quot; value=&amp;quot;&amp;quot;/&amp;gt;&lt;br /&gt;
	&amp;lt;/userInput&amp;gt;&lt;br /&gt;
&amp;lt;/com.izforge.izpack.panels.UserInputPanel&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Certain Cron expressions that fail to generate text descriptions no longer impact scheduling.&lt;br /&gt;
* Text database columns were previously restricted to maximum length of MySQL implementation. Corrected to validate length via DB implementation.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.4.0 ==&lt;br /&gt;
Released June 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* Event Hooks available in [[Embedded_API#List_Event_Hooks|Embedded API]] and [[REST_Endpoints#GET_event_hooks|REST API]].&lt;br /&gt;
* [[Advanced_Configuration#Dependent_Libraries|GSON library]] upgrade to support Java 21&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Oracle identifier no longer too long when using prefixes.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.3.0 ==&lt;br /&gt;
Released March 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* New [[Admin_Host_Status#Event_Hook_Status| Event Hooks Status]] available in the UI.&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Some improvements throughout the [[Admin_Web_Application_Guide|Admin Web Application]] for autofocus of fields.&lt;br /&gt;
* Additional classes and interfaces added to [https://web.obsidianscheduler.com/obsidianapi/ javadoc].&lt;br /&gt;
* Some cleanup in [https://web.obsidianscheduler.com/obsidianapi/ javadoc] documenation.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.2.1 == &lt;br /&gt;
Released January 2024&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Built-in_Jobs#Maintenance_Jobs|Maintenance Jobs]] are now scheduled by default in new installations. Can be disabled via [[Advanced_Configuration#Miscellaneous_Properties|Configuration]] property.&lt;br /&gt;
* New [[Event_Hooks#Standard_Output.2FError_Streams_Event_Hook | Standard Output/Error Streams Event Hook]].&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Schedule descriptions are now updated after edits are applied in all UI screens and APIs.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.2.0 ==&lt;br /&gt;
Released December 2023&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Cron]] &amp;amp; [[Cron#Recurrence|Recur]] patterns along with any use of [[Admin_Schedule_Aliases|Schedule Aliases]] now support plain language description of the patterns throughout the [[Admin_Web_Application_Guide|UI]], visible while hovering patterns, and in [[REST_Endpoints|REST]] and [[Embedded_API|Embedded]] API responses.&lt;br /&gt;
* All screens supporting UI exports now support JSON ([[Admin_Job_Activity#Exporting_Results|Job Activity]], [[Admin_Jobs#Exporting_Results|Jobs]], [[Admin_Job_Runtime_Preview#Exporting_Results|Runtime Previews]], [[Admin_Job_Chains#Job_Chain_Listing|Job Chains]], [[Admin_Logs#Exporting_Results|Logs]], [[Admin_Notifications#Exporting_Results|Sent Notifications]], [[Admin_User_Management#Exporting_Results|Users]], [[Admin_Custom_Calendars#Calendar_Listing|Calendars]])&lt;br /&gt;
* All screens supporting UI exports and search criteria and/or inline filters now include any specified search criteria and filter text in Excel, XML and JSON downloads ([[Admin_Job_Activity#Exporting_Results|Job Activity]], [[Admin_Jobs#Exporting_Results|Jobs]], [[Admin_Job_Runtime_Preview#Exporting_Results|Runtime Previews]], [[Admin_Job_Chains#Job_Chain_Listing|Job Chains]], [[Admin_Logs#Exporting_Results|Logs]], [[Admin_Notifications#Exporting_Results|Sent Notifications]], [[Admin_User_Management#Exporting_Results|Users]])&lt;br /&gt;
* Support for [[Installation_Guide#Choosing_Email_Support|Jakarta EE mail]] &#039;&#039;&#039;Potential breaking change to automated installer files.&#039;&#039;&#039; &amp;lt;ref&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you are using automated installer files from previous releases and had email configured, you will need to add a new section of xml as of Obsidian 5.2.0 to handle a new UserInputPanel. Immediately after the UserInputPanel.16 closing brace, add the following:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;com.izforge.izpack.panels.UserInputPanel id=&amp;quot;UserInputPanel.17&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;userInput&amp;gt;&lt;br /&gt;
        &amp;lt;entry key=&amp;quot;mail.type.selection&amp;quot; value=&amp;quot;javax&amp;quot;/&amp;gt;&lt;br /&gt;
    &amp;lt;/userInput&amp;gt;&lt;br /&gt;
&amp;lt;/com.izforge.izpack.panels.UserInputPanel&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;/ref&amp;gt;&lt;br /&gt;
* New [[Event_Hooks#REST_Endpoint_Event_Hook|REST Endpoint Event Hook]]&lt;br /&gt;
* [[Key_Server_Proxy|Key Server proxy]] artifact obtained via web download during installation&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* Time picker buttons (hour, minute, AM/PM) in [[Admin_Job_Activity#Filtering|Job Activity filtering]] no longer change other elements of the selected time.&lt;br /&gt;
* Cron pattern with [[Cron#Special_Character_Usage|LW]] and any other non-L value in day position no longer also incorrectly evaluates to last day.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.1.1 ==&lt;br /&gt;
Released June 2023&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
&lt;br /&gt;
* [[Authenticator|Native authentication]] no longer fails when user deletes are attempted from the UI.&lt;br /&gt;
* Built in maintenance job [[Built-in_Jobs#Job_History_Cleanup_Job|Job History Cleanup]] no longer leaves deletion candidate CHAIN SKIPPED records in the JOB_HISTORY table in rare circumstances.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.1.0 ==&lt;br /&gt;
Released April 2023&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
&lt;br /&gt;
* [[Admin_Schedule_Aliases#Schedule_Alias_Fragments|Schedule Aliases]] now support fragments for configuration-time substitutions.&lt;br /&gt;
* New convenience job [[Built-in_Jobs#Database_File_Export_Job|Database File Export Job]] for generating basic file extracts from database queries.&lt;br /&gt;
* New convenience job [[Built-in_Jobs#REST_Invocation_Job|REST Invocation Job]] for making simple REST calls and storing results.&lt;br /&gt;
* Performance improvements in job failure handling.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.4 == &lt;br /&gt;
Released February 2022&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.17.1 as fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.17.1 RCE vulnerability] where attackers can modify log4j configuration.&lt;br /&gt;
* Restore missing default log4j2 configuration in installation artifacts.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.3 == &lt;br /&gt;
Released December 2021&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.17.0 as fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.17.0 DOS vulnerability]&lt;br /&gt;
* Fix native login issue showing as inactive on some databases.&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.2 == &lt;br /&gt;
Released December 2021&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.16.0 as permanent fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.16.0 RCE vulnerability]&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.1 == &lt;br /&gt;
Released December 2021&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Log4j2 2.15.0 as fix for [https://logging.apache.org/log4j/2.x/security.html#log4j-2.15.0 RCE vulnerability]&lt;br /&gt;
&lt;br /&gt;
=== Bug Fixes ===&lt;br /&gt;
* Fix sporadic native login issue on some databases.&lt;br /&gt;
* Formatting fix in quick installer file&lt;br /&gt;
&lt;br /&gt;
== Obsidian 5.0.0 == &lt;br /&gt;
Released August 2021.&lt;br /&gt;
&lt;br /&gt;
=== Features / Enhancements ===&lt;br /&gt;
* Java 11 (minimum Java version)&lt;br /&gt;
* [[Admin_Schedule_Aliases|Schedule Aliases]] including support in [[REST_Endpoints#Schedule_Alias_Endpoints|REST API]] and [[Embedded_API#ScheduleAliasManager_API|Embedded API]]&lt;br /&gt;
* [[Admin_User_Management#Multi-Factor_Authentication_.28MFA.29|MFA Support]] for UI logins&lt;br /&gt;
* New [[Admin_User_Management#User_Rights|Author and Operator]] roles&lt;br /&gt;
* Convention-based role permissions by [[Admin_User_Management#Job_Folder_Rights|root job folder]] for Write, Author and Operator.&amp;lt;ref&amp;gt;&lt;br /&gt;
There is a possibility of a breaking change to Embedded or REST API use due to the need to change the [[Embedded_API#Enumerations|User Role enumeration]] from a Java enum to an enum-style class to support this feature. Bringing in the upgraded Obsidian library and compiling should reveal any such broken use of these enumerations. Needed changes should be minor and self-explanatory.&amp;lt;/ref&amp;gt;&lt;br /&gt;
* Bundled Jetty 10.0.2&lt;br /&gt;
* Legacy Embedded API (from Obsidian 1.5) dropped&lt;br /&gt;
* Signal handler disabled by default. Enabled only via [[Advanced_Configuration#Miscellaneous_Properties|configuration]].&lt;br /&gt;
* Many [[Advanced_Configuration#Dependent_Libraries|library upgrades]].&lt;br /&gt;
* UI javascript library updates.&lt;br /&gt;
&lt;br /&gt;
== Footnotes ==&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Installation_Guide&amp;diff=4079</id>
		<title>Installation Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Installation_Guide&amp;diff=4079"/>
		<updated>2026-07-09T20:04:06Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;This installation guide generally applies to Obsidian versions 4.0 and newer but is specific to 6.0. You may see a few minor differences in 4.x and 5.x releases. See the [[Installation_Guide_(3.x.x_and_earlier)|Installation Guide]] for all prior versions.&lt;br /&gt;
&lt;br /&gt;
This installation guide is a companion to the Obsidian Installer UI. Its purpose is to provide additional detail as to the meaning of various inputs and to provide guidance on advanced usage of the installer.&lt;br /&gt;
&lt;br /&gt;
The installer itself installs and configures the artifacts. The configured artifacts will have their [[Advanced_Configuration#Properties_File|Properties]] file configured according to the choices made during the installation process. You may always change these later or use one of the [[Advanced_Configuration#Properties_File|override]] mechanisms.&lt;br /&gt;
== Running the Obsidian Installer ==&lt;br /&gt;
The installer is an executable JAR file in the Obsidian download zip package available on our [https://web.obsidianscheduler.com/download/ download page].&lt;br /&gt;
&lt;br /&gt;
The installer can be run from the command line as a graphical user interface using &amp;lt;code&amp;gt;java -jar Obsidian-Install-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;.jar&amp;lt;/code&amp;gt; or in interactive console mode using &amp;lt;code&amp;gt;java -jar Obsidian-Install-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;.jar -console&amp;lt;/code&amp;gt;. Note that you will have to replace the JAR file name with the actual versioned name in your installation.&lt;br /&gt;
&lt;br /&gt;
On some platforms, simple double-clicking the JAR file will start it in graphical interface mode.&lt;br /&gt;
&lt;br /&gt;
If you are doing a version upgrade of Obsidian or are otherwise uninterested in actually configuring the artifacts, you can run the quick start mode to get the default configured artifacts using &amp;lt;code&amp;gt;java -jar Obsidian-Install-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;.jar h2-winstone-quick-start.xml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Obsidian Installer Artifacts ==&lt;br /&gt;
&lt;br /&gt;
The Obsidian Installer installs and configures a number of artifacts. You can choose which artifacts to create, but most users can leave the default options selected.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Artifacts.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Obsidian WAR&#039;&#039;&#039; - This is the Obsidian Web Admin UI with scheduler component enabled. Configuration will be found at &#039;&#039;INSTALL_PATH&#039;&#039;/obsidian.war!/WEB-INF/classes/com.carfey.properties.&lt;br /&gt;
# &#039;&#039;&#039;Obsidian Standalone Admin WAR&#039;&#039;&#039; - This is the Obsidian Web Admin UI with scheduler component disabled. Configuration will be found at &#039;&#039;INSTALL_PATH&#039;&#039;/standaloneObsidianAdmin.war!/WEB-INF/classes/com.carfey.properties.&lt;br /&gt;
# &#039;&#039;&#039;Standalone Obsidian Runtime&#039;&#039;&#039; - This is a runtime folder containing the libraries and configuration necessary for running the Obsidian Scheduler component either as a standalone module or for use as an Embedded Scheduler in your application. Configuration will be found at &#039;&#039;INSTALL_PATH&#039;&#039;/standalone/obsidian-props.jar!/com.carfey.properties.&lt;br /&gt;
# &#039;&#039;&#039;Obsidian License Proxy&#039;&#039;&#039; - Allows for local license leasing from a [[Key_Server_Proxy|Key Server Proxy]] that ultimately leases licenses from the Obsidian License server.&lt;br /&gt;
# &#039;&#039;&#039;Documentation&#039;&#039;&#039; - README and Embedded API Javadoc.&lt;br /&gt;
# &#039;&#039;&#039;Jetty&#039;&#039;&#039; - A simple servlet container for quick evaluation of the Obsidian UI.&lt;br /&gt;
# &#039;&#039;&#039;License&#039;&#039;&#039; - Obsidian and 3rd party license information.&lt;br /&gt;
&lt;br /&gt;
== Obsidian Configuration ==&lt;br /&gt;
&lt;br /&gt;
The installer will guide you through the configuration Obsidian.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Configuring-Obsidian-6.0.0.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
First, you must choose what [[Authenticator]] mechanism will be used within Obsidian. &#039;&#039;Native (Database)&#039;&#039; authentication requires no additional configuration and is what most users will select. Select &#039;&#039;Other&#039;&#039; if you have implemented your own authentication mechanism, OAuth (OIDC) to configure OAuth or SAML ,&#039;LDAP&#039;&#039; to configure LDAP settings. &lt;br /&gt;
&lt;br /&gt;
Next, you&#039;ll want to select the email usage type. We highly recommend you configure Obsidian for email use as it will allow you to benefit from the event [[Event_Notifications|notification]] and [[Admin_Notifications|subscription]] support in Obsidian.&lt;br /&gt;
&lt;br /&gt;
Then you&#039;ll configure the log file location, license key (optional) and registered company name (optional). Registered company name is only required for our Site License users.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==== OAuth / OIDC Configuration ====&lt;br /&gt;
&lt;br /&gt;
If you selected &#039;&#039;&#039;OAuth (OIDC)&#039;&#039;&#039; as the authentication type, the installer displays additional panels for OAuth configuration.&lt;br /&gt;
&lt;br /&gt;
===== Panel: Provider and Common Settings =====&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Identity Provider&#039;&#039;&#039; — Select your provider: Keycloak, Microsoft Entra ID, Okta, Auth0, or Generic OIDC.&lt;br /&gt;
* &#039;&#039;&#039;Display name&#039;&#039;&#039; — Label shown on the &amp;quot;Sign in with…&amp;quot; button (e.g. &#039;&#039;Keycloak&#039;&#039;, &#039;&#039;Acme Corp SSO&#039;&#039;). If left blank the button reads &amp;quot;Sign in with SSO&amp;quot;.&lt;br /&gt;
* &#039;&#039;&#039;Redirect URI&#039;&#039;&#039; — The callback URL Obsidian receives after IdP login. Must be registered at the IdP (e.g. &#039;&#039;https://app.example.com/oauth/callback&#039;&#039;).&lt;br /&gt;
* &#039;&#039;&#039;Logout mode&#039;&#039;&#039; — &#039;&#039;local&#039;&#039; (default) or &#039;&#039;rp&#039;&#039; (RP-initiated logout via the IdP&#039;s end_session_endpoint).&lt;br /&gt;
&lt;br /&gt;
===== Panel: Provider-Specific Settings =====&lt;br /&gt;
&lt;br /&gt;
Fill in the connection details for your chosen provider.&lt;br /&gt;
&lt;br /&gt;
;Keycloak&lt;br /&gt;
: &#039;&#039;&#039;Issuer URL&#039;&#039;&#039; — e.g. &#039;&#039;https://keycloak.example.com/realms/myrealm&#039;&#039;. &#039;&#039;&#039;Client ID&#039;&#039;&#039; and &#039;&#039;&#039;Client Secret&#039;&#039;&#039; from the Keycloak client settings. &#039;&#039;&#039;Scopes&#039;&#039;&#039; — recommended: &#039;&#039;openid profile email groups&#039;&#039;. Note: Keycloak does not include a &#039;&#039;groups&#039;&#039; claim by default — a Group Membership mapper must be configured in the client&#039;s Mappers tab.&lt;br /&gt;
&lt;br /&gt;
;Microsoft Entra ID&lt;br /&gt;
: &#039;&#039;&#039;Issuer URL&#039;&#039;&#039; — &#039;&#039;https://login.microsoftonline.com/&amp;lt;tenant-id&amp;gt;/v2.0&#039;&#039;. &#039;&#039;&#039;Client ID&#039;&#039;&#039; — the Application (client) ID from the Azure portal. &#039;&#039;&#039;Client Secret&#039;&#039;&#039; — a client secret value from the Azure portal. &#039;&#039;&#039;Scopes&#039;&#039;&#039; — &#039;&#039;openid profile email&#039;&#039;. Note: the &#039;&#039;groups&#039;&#039; claim contains GUIDs by default; configure Optional Claims in the Azure portal to receive group display names. &#039;&#039;&#039;Multi-tenant applications are not supported in Obsidian 7.0.0.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
;Okta&lt;br /&gt;
: &#039;&#039;&#039;Issuer URL&#039;&#039;&#039; — use the &#039;&#039;&#039;Custom Authorization Server&#039;&#039;&#039; URL, e.g. &#039;&#039;https://&amp;lt;domain&amp;gt;.okta.com/oauth2/default&#039;&#039;. Do &#039;&#039;&#039;not&#039;&#039;&#039; use the Org Authorization Server URL. &#039;&#039;&#039;Client ID&#039;&#039;&#039; and &#039;&#039;&#039;Client Secret&#039;&#039;&#039; from Okta application settings. &#039;&#039;&#039;Scopes&#039;&#039;&#039; — &#039;&#039;openid profile email groups&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
;Auth0&lt;br /&gt;
: &#039;&#039;&#039;Domain / Issuer URL&#039;&#039;&#039; — e.g. &#039;&#039;https://&amp;lt;domain&amp;gt;.auth0.com/&#039;&#039;. &#039;&#039;&#039;Client ID&#039;&#039;&#039; and &#039;&#039;&#039;Client Secret&#039;&#039;&#039; from Auth0 application settings. &#039;&#039;&#039;Scopes&#039;&#039;&#039; — &#039;&#039;openid profile email&#039;&#039;. &#039;&#039;&#039;Important:&#039;&#039;&#039; Auth0 issues opaque access tokens by default which are &#039;&#039;&#039;not supported&#039;&#039;&#039; on Obsidian&#039;s REST/Bearer path — configure a custom API in Auth0 to get JWT access tokens.&lt;br /&gt;
&lt;br /&gt;
;Generic OIDC&lt;br /&gt;
: &#039;&#039;&#039;Issuer URL&#039;&#039;&#039; — the base URL; Obsidian appends &#039;&#039;/.well-known/openid-configuration&#039;&#039; to discover endpoints. &#039;&#039;&#039;Client ID&#039;&#039;&#039; and &#039;&#039;&#039;Client Secret&#039;&#039;&#039; from the provider. &#039;&#039;&#039;Scopes&#039;&#039;&#039; — at minimum &#039;&#039;openid&#039;&#039;; add &#039;&#039;profile&#039;&#039; and your groups scope as needed.&lt;br /&gt;
&lt;br /&gt;
===== Panel: Group → Role Mapping =====&lt;br /&gt;
&lt;br /&gt;
The final OAuth panel maps IdP group values to Obsidian roles. &#039;&#039;&#039;Require role assignment&#039;&#039;&#039; (default yes) — when enabled, users with no matching roles cannot complete browser login. At least one mapping to the &#039;&#039;&#039;Admin&#039;&#039;&#039; role is required. The installer supports up to 10 group→role pairs; additional pairs can be added directly to the configuration file after install. See [[Advanced_Configuration#OAuth_/_OIDC_Authentication_Properties]] for the full property reference.&lt;br /&gt;
&lt;br /&gt;
===== Registering the redirect URI at the IdP =====&lt;br /&gt;
&lt;br /&gt;
Before starting Obsidian, register the redirect URI shown in the installer at your IdP: Keycloak — Client → Settings → Valid Redirect URIs; Entra ID — App Registration → Authentication → Redirect URIs; Okta — Application → General Settings → Sign-in Redirect URIs; Auth0 — Application → Settings → Allowed Callback URLs. The URI must match &#039;&#039;com.carfey.suite.security.OAuthAuthenticator.redirectUri&#039;&#039; exactly, including scheme and port.&lt;br /&gt;
&lt;br /&gt;
==== LDAP Configuration ====&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Configure.LDAP.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you&#039;ve selected LDAP Authentication, this screen takes you through configuring the server address and the various elements used to grant access. You should familiarize yourself with Obsidian [[Authenticator#Roles|Roles]]. The &#039;&#039;Access DN&#039;&#039; configuration element grants Read access to Obsidian application. You may use the same DN for more than one Role should you so wish.&lt;br /&gt;
&lt;br /&gt;
==== Custom Authenticator Configuration====&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Configure.CustomAuthenticator.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you have chosen to use your own authentication mechanism, you must enter the fully qualified classname here.&lt;br /&gt;
&lt;br /&gt;
==== Database Configuration ====&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Database.Configuration.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Next comes database configuration. If you are using JNDI, leave the username and password fields blank. If using JDBC URL, username and password fields are required.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;Database connections per instance&#039;&#039; and &#039;&#039;Database connection timeout(millis)&#039;&#039; fields are required and provide directive to the connection pool.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Database table name prefix&#039;&#039; is optional and is typically used when Obsidian will be colocated in an existing database/schema.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Database schema (Oracle/PostgreSQL)&#039;&#039; - This is used to allow for an alternate schema other than the default user&#039;s schema. We also recommend setting this value with Oracle/PostgreSQL when using JNDI as it allows more efficient database metadata loading.&lt;br /&gt;
&lt;br /&gt;
By default, the Obsidian installation will only include the JDBC libraries necessary for your particular database. At times you may wish to include the others to be able to change between databases. In those cases, check &#039;&#039;Include all supported JDBC libs&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==== Email Configuration ====&lt;br /&gt;
&lt;br /&gt;
If not using JNDI for mail sessions, provide the server and authentication details as required.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Configure.SSL.Email.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Configure.TLS.Email.png]]&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Configure.Open.Email.png]]&lt;br /&gt;
&lt;br /&gt;
==== JNDI Configuration ====&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Configure.JNDI.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you have selected JNDI for mail sessions, provide the JNDI path here. If you are using JNDI for Database connections, specify the database type.&lt;br /&gt;
&lt;br /&gt;
==== Configuring 3rd Party Library Conflict Management ====&lt;br /&gt;
[[Image:JarJar-Obsidian-6.0.0.png]]&lt;br /&gt;
&lt;br /&gt;
The Obsidian installer allows you to use [https://code.google.com/archive/p/jarjar JarJar] to handle potential conflicts between Obsidian&#039;s use of 3rd party libraries and versions used within your application. On this screen, simply select which libraries to which you wish to apply the JarJar bytecode modification process. This is optional and is skipped if no libraries are selected. Any jars not listed for which you are using more recent versions can be used and are therefore not included as options in the JarJar processing.&lt;br /&gt;
&lt;br /&gt;
==== Selecting Script Libraries ====&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-6.0.0-Choose-Scripting-Libraries.png]]&lt;br /&gt;
&lt;br /&gt;
The Obsidian installer allows you to select which script libraries you wish to include. Jython and JRuby are incompatible with each other, so the installer will only allow one of the two selected. If all script libraries are deselected, the only script jobs that can be run in Obsidian will be Javascript jobs as that engine is built into Java.&lt;br /&gt;
&lt;br /&gt;
==== Choosing Email Support ====&lt;br /&gt;
As of Obsidian 5.2.0, you can choose between JavaMail (javax) and Jakarta mail (Jakarta EE) implementations. When choosing Jakarta, you can also choose to bundle the Angus Jakarta compatible implementation. &lt;br /&gt;
&lt;br /&gt;
If you are using JNDI, this will only include the relevant support in the Obsidian WAR artifacts and the actual libraries in use must be provided by you and bundled with your container. If the standalone scheduler is selected along with JNDI, JNDI is assumed only relevant for WARs. As such, default libraries for either JavaMail or Jakarta will be included in the standalone installation.&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.EmailImplementation.Configuration.png]]&lt;br /&gt;
&lt;br /&gt;
==== Additional configuration items ====&lt;br /&gt;
&lt;br /&gt;
As of Obsidian 5.5.0, if you require any additional configuration items such as additional appenders/loggers or event hook configurations, you can add them here.&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.5.0.Extra.Configuration.png]]&lt;br /&gt;
&lt;br /&gt;
==== Offline or restricted-network install ====&lt;br /&gt;
&lt;br /&gt;
Obsidian 7.0.0 resolves third-party libraries when you run the installer. For environments without direct access to Maven Central:&lt;br /&gt;
&lt;br /&gt;
# Pre-stage a local dependency cache containing every coordinate listed in the Obsidian dependency inventory for your release (contact Carfey support or your account team for the checklist file matching &#039;&#039;&#039;Obsidian-Install-7.0.0.jar&#039;&#039;&#039;).&lt;br /&gt;
# Copy the cache to the install host. Two layouts are supported:&lt;br /&gt;
#* &#039;&#039;&#039;Flat:&#039;&#039;&#039; one file per installed JAR name directly under the cache root.&lt;br /&gt;
#* &#039;&#039;&#039;File Maven repo:&#039;&#039;&#039; &#039;&#039;&#039;&amp;lt;group&amp;gt;/&amp;lt;artifact&amp;gt;/&amp;lt;version&amp;gt;/&amp;lt;installed-filename&amp;gt;.jar&#039;&#039;&#039;&lt;br /&gt;
# Run the installer with offline mode and the cache directory:&lt;br /&gt;
&lt;br /&gt;
 java -Dobsidian.install.deps.offline=true -Dobsidian.install.deps.cache.dir=/path/to/cache -jar Obsidian-Install-7.0.0.jar&lt;br /&gt;
&lt;br /&gt;
If a required library is missing from the cache, the install stops with an error naming the coordinate — add that artifact to the cache and re-run.&lt;br /&gt;
&lt;br /&gt;
===== Corporate Maven mirror (online) =====&lt;br /&gt;
&lt;br /&gt;
When your site mirrors Maven Central, point the installer at your repository base URL:&lt;br /&gt;
&lt;br /&gt;
 java -Dobsidian.install.deps.repo.url=https://nexus.example.com/repository/maven-public/ -jar Obsidian-Install-7.0.0.jar&lt;br /&gt;
&lt;br /&gt;
The installer reuses resolved artifacts for the duration of one install session.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Completing the Installation ==&lt;br /&gt;
&lt;br /&gt;
[[Image:Obsidian-5.0.0.Installer.Finished.png]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Once you&#039;ve completed the Installation and Configuration screens, fully configured Obsidian Scheduler artifacts are now ready for you to use in the installation path you selected.&lt;br /&gt;
&lt;br /&gt;
Should you wish to automate future installations with the same configuration, click &#039;&#039;Generate an automatic installation script&#039;&#039;. This will prompt you to save an XML file that can be used for future installations using the automated install procedure &amp;lt;code&amp;gt;java -jar Obsidian-Install-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;.jar my-obsidian-configuration.xml&amp;lt;/code&amp;gt;. Every effort is made to ensure compatibility of these automated install files between versions. Any incompatibility will be noted in the [[Release_Notes|Release Notes]]. These automated installer files can also be used as templates for other environments, modifying them as necessary.&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=File:Obsidian-7.0.0-Configuring-Obsidian.png&amp;diff=4078</id>
		<title>File:Obsidian-7.0.0-Configuring-Obsidian.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=File:Obsidian-7.0.0-Configuring-Obsidian.png&amp;diff=4078"/>
		<updated>2026-07-09T20:00:24Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=File:Obsidian-7.0.0-Configuring-OAuth_OIDC.png&amp;diff=4077</id>
		<title>File:Obsidian-7.0.0-Configuring-OAuth OIDC.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=File:Obsidian-7.0.0-Configuring-OAuth_OIDC.png&amp;diff=4077"/>
		<updated>2026-07-09T20:00:10Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=File:Obsidian-7.0.0-Configuring-Keycloak.png&amp;diff=4076</id>
		<title>File:Obsidian-7.0.0-Configuring-Keycloak.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=File:Obsidian-7.0.0-Configuring-Keycloak.png&amp;diff=4076"/>
		<updated>2026-07-09T19:59:58Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=File:Obsidian-7.0.0-Configuring-Microsoft-Entra-ID.png&amp;diff=4075</id>
		<title>File:Obsidian-7.0.0-Configuring-Microsoft-Entra-ID.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=File:Obsidian-7.0.0-Configuring-Microsoft-Entra-ID.png&amp;diff=4075"/>
		<updated>2026-07-09T19:59:49Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=File:Obsidian-7.0.0-Configuring-Okta.png&amp;diff=4074</id>
		<title>File:Obsidian-7.0.0-Configuring-Okta.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=File:Obsidian-7.0.0-Configuring-Okta.png&amp;diff=4074"/>
		<updated>2026-07-09T19:59:38Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=File:Obsidian-7.0.0-Configuring-Auth0.png&amp;diff=4073</id>
		<title>File:Obsidian-7.0.0-Configuring-Auth0.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=File:Obsidian-7.0.0-Configuring-Auth0.png&amp;diff=4073"/>
		<updated>2026-07-09T19:59:29Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=File:Obsidian-7.0.0-Configuring-Generic_OIDC.png&amp;diff=4072</id>
		<title>File:Obsidian-7.0.0-Configuring-Generic OIDC.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=File:Obsidian-7.0.0-Configuring-Generic_OIDC.png&amp;diff=4072"/>
		<updated>2026-07-09T19:59:22Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=File:Obsidian-7.0.0-OAuth-Group-Role-Mapping.png&amp;diff=4071</id>
		<title>File:Obsidian-7.0.0-OAuth-Group-Role-Mapping.png</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=File:Obsidian-7.0.0-OAuth-Group-Role-Mapping.png&amp;diff=4071"/>
		<updated>2026-07-09T19:59:10Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Getting_Started&amp;diff=4070</id>
		<title>Getting Started</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Getting_Started&amp;diff=4070"/>
		<updated>2026-07-09T19:24:12Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This Getting Started is for Obsidian 4.0 and newer versions. See the [[Getting_Started_(3.x.x_and_earlier)|Previous Getting Started]] for prior versions.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This guide will help you choose a deployment setup that works for you, and then get it running. Before reading this page, you may wish to review Obsidian&#039;s [[Deployment Models]] to understand the different parts of Obsidian or to find out what deployment model works for you.&lt;br /&gt;
&lt;br /&gt;
If you&#039;ve are looking to start writing your own Obsidian jobs, see [[Implementing Jobs]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
= Supported Platforms =&lt;br /&gt;
&lt;br /&gt;
Please quickly review our supported platforms before continuing.&lt;br /&gt;
&lt;br /&gt;
* Obsidian is OS-independent, and runs on the Java Virtual Machine. It works in a variety of environments, including Linux, OSX and Windows, and can be run inside virtual machines.&lt;br /&gt;
* Obsidian 5.x.x and 6.x.x run on Java 11 or above (Obsidian 4.x.x runs on Java 1.7 or above)&lt;br /&gt;
* Obsidian&#039;s administration web application is a servlet application.&lt;br /&gt;
** 6.x.x has been tested on Tomcat 10.x and Jetty 11.x (Jakarta Servlet 5.0)&lt;br /&gt;
** 5.x.x has been tested on Tomcat 9.x and Jetty 10.x (Javax Servlet 4.0)&lt;br /&gt;
** 4.x.x has been tested on Tomcat 7, 8 &amp;amp; 8.5 and Jetty 9.x (Javax Servlet 4.0)&lt;br /&gt;
* It works on all modern browsers and is tested on recent versions of Chrome, Edge and Firefox.&lt;br /&gt;
* Obsidian requires one of the following fully-supported database platforms:&lt;br /&gt;
** MySQL 8.0.x (Obsidian 5.x and higher), 5.5-5.7 (excluding Galera)&lt;br /&gt;
** MariaDB 5.5&lt;br /&gt;
** Oracle 18c, 19c, 21c on Obsidian 5.x and higher&lt;br /&gt;
** Oracle 10g, 11.x, 12c on versions prior to Obsidian 5.0.0&lt;br /&gt;
** PostgreSQL 11-16 on Obsidian 5.x and higher&lt;br /&gt;
** PostgreSQL 9, 10&lt;br /&gt;
** MS SQL Server 2008-2019&lt;br /&gt;
** H2 1.4. &lt;br /&gt;
** &#039;&#039;Larger major versions are likely to work without issues but are not officially supported.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; With some exceptions, clustered scheduler instances require access to contact license servers over the Internet, or access to an internal proxy license server. See [[Licenses &amp;amp; Nodes]] for more information.&lt;br /&gt;
&lt;br /&gt;
== Hardware Requirements ==&lt;br /&gt;
&lt;br /&gt;
We recommend the following minimum hardware for typical installations:&lt;br /&gt;
&lt;br /&gt;
* 1 GHz processor&lt;br /&gt;
* 2 GB RAM&lt;br /&gt;
* 1 GB hard disk space (excluding accumulated logs)&lt;br /&gt;
&lt;br /&gt;
Note that actual requirements may vary depending on job volume, clustering and other factors.&lt;br /&gt;
&lt;br /&gt;
= Choose Your Installation Type =&lt;br /&gt;
&lt;br /&gt;
Obsidian consists of two main processes:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Scheduler&#039;&#039;&#039; - schedules and executes jobs, sends notifications, etc. Also exposes the [[Embedded API]].&lt;br /&gt;
* &#039;&#039;&#039;Admin Web Application&#039;&#039;&#039; - provides management and monitoring UI, plus the [[REST API]] and [[Embedded API]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
These can be run together or separately in the following configurations. You will pick one or more of these options together to provide both the scheduler and admin web application functionality.&lt;br /&gt;
&lt;br /&gt;
# &#039;&#039;&#039;Standalone Scheduler&#039;&#039;&#039; - A Java process that performs job execution. A standalone scheduler installation is generated when you run the Obsidian installer, and may be customized by adding JAR files containing your job code. It is started and stopped by scripts included with the installation. Requires a separate admin web application to be deployed.&lt;br /&gt;
# &#039;&#039;&#039;Embedded Scheduler&#039;&#039;&#039; - Provides job execution like a standalone scheduler, but instead runs as a process embedded within and started from your application. This eliminates the need to customize and deploy a separate artifact which will perform job execution. Requires a separate admin web application to be deployed.&lt;br /&gt;
# &#039;&#039;&#039;Standalone Admin Web Application&#039;&#039;&#039; - A Java servlet application providing Obsidian&#039;s administration capabilities but no scheduling services.  A standalone admin application WAR file is generated when you run the Obsidian installer, and may be customized by adding JAR files containing your job code.  Requires a separate standalone, embedded or combined scheduler and web application to be deployed for job execution to be performed.&lt;br /&gt;
# &#039;&#039;&#039;Combined Scheduler and Admin Web Application&#039;&#039;&#039; - A version of the admin web application which also runs a scheduler service for job execution. A combined scheduler and admin application WAR file is generated when you run the Obsidian installer, and may be customized by adding JAR files containing your job code. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Regardless of the deployment configuration, any time you run more than one scheduler process operating against the same Obsidian database, they will automatically form a cluster and share in job execution.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Choosing which installation type works best for you depends on your specific needs. The setups which are suitable for most cases are, in order: &lt;br /&gt;
&lt;br /&gt;
* Using an &#039;&#039;&#039;Embedded Scheduler&#039;&#039;&#039; (option 2), along with a &#039;&#039;&#039;Standalone Admin Web Application&#039;&#039;&#039; (option 3). This approach lets you embed Obsidian into your existing application without having to alter the Obsidian artifacts to include your job code. Instead, Obsidian&#039;s required libraries are included in your application and they are deployed together.&lt;br /&gt;
* Using a  &#039;&#039;&#039;Combined Scheduler and Admin Web Application&#039;&#039;&#039; (option 4) alone or in a cluster. This is suitable if you don&#039;t have another application containing job code for Obsidian to execute, or if you simply want to use Obsidian&#039;s scripting support, which doesn&#039;t require deploying JAR files.&lt;br /&gt;
&lt;br /&gt;
= Downloading Obsidian =&lt;br /&gt;
Just go to our [https://web.obsidianscheduler.com/download/ download page], and grab the latest Obsidian&#039;s installation zip file. There is no need to register or obtain a license before downloading.&lt;br /&gt;
&lt;br /&gt;
Once you&#039;ve downloaded the zip file, extract it to a directory of your choice.&lt;br /&gt;
&lt;br /&gt;
If you are trying to upgrade to a newer version of Obsidian, see [[Upgrading_Obsidian|upgrade]] instructions.&lt;br /&gt;
&lt;br /&gt;
= Quick Start for Evaluation Purposes =&lt;br /&gt;
&lt;br /&gt;
If you wish to quickly try Obsidian without minimal setup required, follow these steps. Otherwise, skip ahead to [[#Initial Setup|Initial Setup]].&lt;br /&gt;
&lt;br /&gt;
== Really Quick Method Using Embedded Database ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;We do not recommend this setup for production use. &#039;&#039;&lt;br /&gt;
&lt;br /&gt;
# Ensure you have a JDK (11 or up for Obsidian 6.x.x &amp;amp; 5.x.x, 1.7 or up for Obsidian 4.x.x) installed and that the &amp;lt;code&amp;gt;JAVA_HOME&amp;lt;/code&amp;gt; environment variable is set to your JDK installation directory.&lt;br /&gt;
# Unzip the Obsidian download zip file to a directory of your choice.&lt;br /&gt;
# At the command line, in the zip extraction directory, run the [[Installation_Guide|installer]] using this command, substituting the appropriate Obsidian version number: &amp;lt;code&amp;gt;java -jar Obsidian-Install-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;.jar h2-jetty-quick-start.xml&amp;lt;/code&amp;gt;&lt;br /&gt;
# Start Obsidian using the command: &amp;lt;code&amp;gt;./webObsidian.sh start scheduler&amp;lt;/code&amp;gt; for Linux or &amp;lt;code&amp;gt;webObsidian.bat start scheduler&amp;lt;/code&amp;gt; for Windows.&lt;br /&gt;
# Go to http://localhost:8080 in your browser and check out your fully functional Obsidian web application and scheduler! You can log in to the admin web application with the default user &#039;&#039;admin&#039;&#039; and password &#039;&#039;changeme&#039;&#039;.&lt;br /&gt;
# When you&#039;re done, stop Obsidian using the command: &amp;lt;code&amp;gt;./webObsidian.sh stop&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;webObsidian.bat stop&amp;lt;/code&amp;gt; for Windows.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; If you restart the Quick Start installation and see &amp;quot;lock wait timeout&amp;quot; or similar errors in the log screen, you may have to delete your embedded H2 database lock file. By default, the file name is &#039;&#039;obsidian.lock.db&#039;&#039; and is located in the user home directory.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; If you see a &amp;lt;code&amp;gt;java.net.BindException: Permission denied&amp;lt;/code&amp;gt; error on startup, you will need to use an alternate port. See [[Troubleshooting]] for details on how to change this.&lt;br /&gt;
&lt;br /&gt;
== Quick Method Using Existing Database ==&lt;br /&gt;
&lt;br /&gt;
If you wish to get Obsidian running quickly using a database platform you already have running, follow these steps:&lt;br /&gt;
&lt;br /&gt;
# Ensure you have a JDK (11 or up for Obsidian 6.x.x and 5.x.x, 1.7 or up for Obsidian 4.x.x) installed and that the &amp;lt;code&amp;gt;JAVA_HOME&amp;lt;/code&amp;gt; environment variable is set to your JDK installation directory.&lt;br /&gt;
# Unzip the Obsidian download zip file to a directory of your choice.&lt;br /&gt;
# At the command line, in the zip extraction directory, run the [[Installation_Guide|installer]] using this command, substituting the appropriate Obsidian version number: &amp;lt;code&amp;gt;java -jar Obsidian-Install-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;-&#039;&#039;n&#039;&#039;.jar&amp;lt;/code&amp;gt;&lt;br /&gt;
# Start Obsidian using the command: &amp;lt;code&amp;gt;./webObsidian.sh start scheduler&amp;lt;/code&amp;gt; for Linux or &amp;lt;code&amp;gt;webObsidian.bat start scheduler&amp;lt;/code&amp;gt; for Windows.&lt;br /&gt;
# Go to http://localhost:8080 in your browser and check out your fully functional Obsidian web application and scheduler! You can log in to the admin web application with the default user &#039;&#039;admin&#039;&#039; and password &#039;&#039;changeme&#039;&#039;.&lt;br /&gt;
# When you&#039;re done, stop Obsidian using the command: &amp;lt;code&amp;gt;./webObsidian.sh stop&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;webObsidian.bat stop&amp;lt;/code&amp;gt; for Windows.&lt;br /&gt;
&lt;br /&gt;
= Initial Setup  =&lt;br /&gt;
&lt;br /&gt;
This section covers the setup required after you&#039;ve selected your [[#Choose_Your_Installation_Type|installation type]]. &lt;br /&gt;
&lt;br /&gt;
== Database ==&lt;br /&gt;
&lt;br /&gt;
Obsidian requires a database which must be created before running Obsidian. Multiple [[#Supported Platforms|database platforms]] are supported. Obsidian can share a database/schema with another application.&lt;br /&gt;
&lt;br /&gt;
Note that the database must exist before deployment, but by default Obsidian will automatically create all required tables.&lt;br /&gt;
&lt;br /&gt;
Later, you will specify database connection parameters within Obsidian&#039;s installer to tell it how to connect. If you need to configure advanced settings or change settings directly after you&#039;ve run run the installer, see [[Advanced Configuration]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Obsidian needs to create the tables in the target database. If the schema is shared with your application’s tables, please ensure there are no name conflicts. If there are conflicts, separate schemas/databases can be used, or a table prefix can be specified as shown in [[Advanced_Configuration#Database_Properties|Advanced Configuration]]. [[Obsidian Tables]] lists the tables Obsidian will created upon first deployment.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Manual Schema Creation ===&lt;br /&gt;
&lt;br /&gt;
When you start Obsidian, it will automatically detect and create missing tables in your target database. However, if you wish to run Obsidian with a database user that does not have create privileges, or simply wish to prepare your database structure ahead of time, you can use the database scripts provided with your download zip file under the &amp;quot;db_scripts&amp;quot; directory.&lt;br /&gt;
&lt;br /&gt;
First create your database, and locate the &amp;quot;complete.sql&amp;quot; file under the directory for the database you are using under the &amp;quot;db_scripts&amp;quot; directory. Statements within this file contain the token &amp;quot;$px$&amp;quot; to enable table prefixes. Before you run the SQL file, replace all instances of the token &amp;quot;$px$&amp;quot; (without quotes) with a table prefix 6 characters or shorter (letters and underscores supported), or with blank.&lt;br /&gt;
&lt;br /&gt;
Then, in your SQL client of choice, execute the script and all the required Obsidian tables will be created.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Alternate Oracle Schemas ===&lt;br /&gt;
&lt;br /&gt;
After allowing Obsidian to create all the required tables and initial data by deploying it a single time, Obsidian can be run with an alternate Oracle user by specifying the target schema on Oracle databases. See [[Advanced_Configuration#Database_Properties|Advanced Configuration]] for the property to set.&lt;br /&gt;
&lt;br /&gt;
If you use a separate user from the schema owner, you must grant the user [[Obsidian_Tables#Oracle Privileges|certain privileges]] for Obsidian to function correctly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== MS SQL Server Snapshot Isolation ===&lt;br /&gt;
&lt;br /&gt;
For maximum compatibility and to avoid deadlocks, MS SQL Server should be configured to use [https://learn.microsoft.com/en-us/dotnet/framework/data/adonet/sql/snapshot-isolation-in-sql-server read committed snapshot isolation].&lt;br /&gt;
&lt;br /&gt;
This can be enabled on your database by running the following commands:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
ALTER DATABASE MyDatabase SET ALLOW_SNAPSHOT_ISOLATION ON&lt;br /&gt;
ALTER DATABASE MyDatabase SET READ_COMMITTED_SNAPSHOT ON&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Authentication ==&lt;br /&gt;
&lt;br /&gt;
By default, Obsidian manages its own set users and logins to restrict access to the admin web application and REST API. A default “admin” user is created when the scheduler is first deployed and no additional setup is required.&lt;br /&gt;
&lt;br /&gt;
Alternatively, to use LDAP authentication, select the LDAP option in the installer and enter your LDAP details.&lt;br /&gt;
&lt;br /&gt;
As of 7.0.0, you can also select OAuth / OIDC authentication to enable Single Sign-On via an external identity provider. See [[Authenticator#OAuthAuthenticator_(OIDC_SSO)|OAuthAuthenticator]] for details.&lt;br /&gt;
&lt;br /&gt;
Finally, you may implement your own [[authenticator|custom authenticator]] Java class, which you also enter when running the installer.&lt;br /&gt;
&lt;br /&gt;
= Running the Installer =&lt;br /&gt;
&lt;br /&gt;
Now that you&#039;ve chosen your installation type and performed initial setup of your database and authentication, you can run Obsidian&#039;s installer to configure and build a set of artifacts that you can either use to embed Obsidian, or deploy directly.&lt;br /&gt;
&lt;br /&gt;
To run the installer, please follow our detailed [[Installation_Guide|installation guide]].&lt;br /&gt;
&lt;br /&gt;
== Installer-Created Artifacts ==&lt;br /&gt;
&lt;br /&gt;
Once you&#039;ve run the installer, your installation directory will look something like the following, depending on which artifacts you chose to generate. Key files and directories are shown below.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
├───db_scripts&lt;br /&gt;
└───Obsidian-6.n.n&lt;br /&gt;
    │   com.carfey.yaml.reference&lt;br /&gt;
    │   obsidian.war&lt;br /&gt;
    │   obsidian-builtin-job-src.jar&lt;br /&gt;
    │   obsidianForkedJob.bat&lt;br /&gt;
    │   obsidianForkedJob.sh&lt;br /&gt;
    │   obsidian-javadoc.zip&lt;br /&gt;
    │   standaloneObsidian.bat&lt;br /&gt;
    │   standaloneObsidian.sh&lt;br /&gt;
    │   standaloneObsidianAdmin.war&lt;br /&gt;
    │   webObsidian.bat&lt;br /&gt;
    │   webObsidian.sh&lt;br /&gt;
    │&lt;br /&gt;
    ├───jetty&lt;br /&gt;
    ├───license&lt;br /&gt;
    ├───logs&lt;br /&gt;
    └───standalone&lt;br /&gt;
        (various JAR files...)&lt;br /&gt;
        obsidian-yaml-configuration.jar&lt;br /&gt;
        obsidian.jar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
The installer creates a top-level directory named &amp;lt;code&amp;gt;Obsidian-&#039;&#039;n&#039;&#039;.&#039;&#039;n&#039;&#039;.&#039;&#039;n&#039;&#039;&amp;lt;/code&amp;gt; containing generated artifacts. The key files and directories are:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;com.carfey.yaml.reference&#039;&#039;&#039; or &#039;&#039;&#039;com.carfey.properties.reference&#039;&#039;&#039; - Copy of configuration file generated by the installer.&lt;br /&gt;
* &#039;&#039;&#039;obsidian.war&#039;&#039;&#039; - Combined scheduler and admin web application WAR. This can be deployed directly to a servlet container. This artifact can be customized by adding your job code and dependencies as JARS to the &amp;lt;code&amp;gt;/WEB-INF/lib&amp;lt;/code&amp;gt; directory within the archive.&lt;br /&gt;
* &#039;&#039;&#039;standaloneObsidian.bat&#039;&#039;&#039; and  &#039;&#039;&#039;standaloneObsidian.sh&#039;&#039;&#039; - Windows and Linux scripts to start the standalone scheduler process with no web application. The standalone scheduler can be customized by adding your job code and dependencies as JARS to the &amp;lt;code&amp;gt;standalone&amp;lt;/code&amp;gt; directory.&lt;br /&gt;
* &#039;&#039;&#039;webObsidian.bat&#039;&#039;&#039; and  &#039;&#039;&#039;webObsidian.sh&#039;&#039;&#039; - .bat - Windows and Linux scripts to start either the standalone web application or combined scheduler and admin web application within the bundled Jetty server. &lt;br /&gt;
* &#039;&#039;&#039;standaloneObsidianAdmin.war&#039;&#039;&#039; - Standalone admin web application WAR (no scheduler). This can be deployed directly to a servlet container.&lt;br /&gt;
* &#039;&#039;&#039;standalone&#039;&#039;&#039; - Directory containing JARs that Obsidian requires to run the standalone scheduler process.  The standalone scheduler can be customized by adding your job code and dependencies as JARS to this directory.&lt;br /&gt;
** &#039;&#039;&#039;obsidian-yaml-configuration.jar&#039;&#039;&#039; or &#039;&#039;&#039;obsidian-properties-configuration.jar&#039;&#039;&#039; - JAR file containing the Obsidian configuration file - either &amp;lt;code&amp;gt;com.carfey.yaml&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;com.carfey.properties&amp;lt;/code&amp;gt; respectively. If you wish to make configuration changes for the standalone scheduler, the configuration file within this JAR will need to be updated.&lt;br /&gt;
&lt;br /&gt;
= Embedding Obsidian &amp;amp; Customizing Artifacts =&lt;br /&gt;
&lt;br /&gt;
The Obsidian scheduler process needs Java classpath access to your jobs so it can detect valid jobs and execute them. This requires a bit of customization before you are ready to run custom Java jobs. If you still haven&#039;t created your custom jobs, consult [[Implementing Jobs]] before proceeding. If you only intend to use [[Scripting Jobs]], customization will not be required and you can skip to [[#Deployment|Deployment]].&lt;br /&gt;
&lt;br /&gt;
If you want to embed Obsidian into your application or need to deploy jobs and their dependent libraries to the generated Obsidian artifacts, follow the steps in the appropriate sections below.&lt;br /&gt;
&lt;br /&gt;
Note that only Obsidian scheduler processes need to be customized to include your job code. The admin web application itself does not require classpath access to your jobs.&lt;br /&gt;
&lt;br /&gt;
== Embedding Obsidian - Importing Libraries and Properties File ==&lt;br /&gt;
&lt;br /&gt;
To embed Obsidian, you will need to update your application build to bring in the JAR files it requires, along with the Obsidian properties file. Simply follow these steps:&lt;br /&gt;
&lt;br /&gt;
# Import all required [[Advanced_Configuration#Dependent_Libraries|Obsidian JAR files]] into your project and reference them in your build files. &lt;br /&gt;
#* These can be obtained from the &amp;lt;code&amp;gt;standalone&amp;lt;/code&amp;gt; directory of your installation. Make sure you &#039;&#039;&#039;exclude&#039;&#039;&#039; &amp;lt;code&amp;gt;obsidian-(yaml/properties)-configuration.jar&amp;lt;/code&amp;gt;&lt;br /&gt;
#* Ensure your Maven, Gradle or Ant files are updated to include all required libraries in your build, along with your IDE.&lt;br /&gt;
# Make a copy of &amp;lt;code&amp;gt;com.carfey.yaml.reference&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;com.carfey.properties.reference&amp;lt;/code&amp;gt; from your installation with the &amp;lt;code&amp;gt;.reference&amp;lt;/code&amp;gt; suffix removed, and add it to your project&#039;s classpath.&lt;br /&gt;
#* This is typically just a matter of adding it to your project&#039;s resources directory.&lt;br /&gt;
#* From now on, you can update this file to change the various configuration options such as database connection details.&lt;br /&gt;
#* You may wish to leave this file out of source control and let developers configure their own installations. However, any running Obsidian instance will need access to a valid [[Advanced_Configuration#Properties.2FYaml_File|properties file]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Maven users:&#039;&#039;&#039; Note that we do not publish Maven artifacts for Obsidian, so you will not be able to include them by referencing a public repository.&lt;br /&gt;
&lt;br /&gt;
== Adding Custom Jobs to Standalone Scheduler ==&lt;br /&gt;
&lt;br /&gt;
In order for the standalone scheduler to detect and execute custom jobs written in Java, you will need to ensure Obsidian&#039;s classpath contains the compiled job code, along with its dependencies.&lt;br /&gt;
&lt;br /&gt;
To do so, you need to perform just one step before starting the standalone scheduler:&lt;br /&gt;
&lt;br /&gt;
# Copy JAR files containing custom Obsidian jobs and all runtime dependencies to the &amp;lt;code&amp;gt;standalone&amp;lt;/code&amp;gt; directory in your installation.&lt;br /&gt;
#* These JARs should be alongside &amp;lt;code&amp;gt;obsidian.jar&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* All JAR files in this directory will be automatically added to the classpath when run via the &amp;lt;code&amp;gt;standaloneObsidian.sh&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;standaloneObsidian.bat&amp;lt;/code&amp;gt; scripts.&lt;br /&gt;
&lt;br /&gt;
== Adding Custom Jobs to Combined Scheduler and Admin Web Application ==&lt;br /&gt;
&lt;br /&gt;
In order for the combined scheduler and admin web application to detect and execute custom jobs written in Java, you will need to ensure Obsidian&#039;s classpath contains the compiled job code, along with its dependencies.&lt;br /&gt;
&lt;br /&gt;
To do so, you need to perform just one step before deploying the Obsidian WAR file:&lt;br /&gt;
&lt;br /&gt;
# Copy JAR files containing custom Obsidian jobs and all runtime dependencies to the &amp;lt;code&amp;gt;WEB-INF/lib&amp;lt;/code&amp;gt; directory within the WAR archive.&lt;br /&gt;
#* These JARs should be alongside &amp;lt;code&amp;gt;obsidian.jar&amp;lt;/code&amp;gt;.&lt;br /&gt;
#* WAR files use the ZIP format and can be extracted and recompressed with normal ZIP tools or the JDK &amp;lt;code&amp;gt;jar&amp;lt;/code&amp;gt; utility.&lt;br /&gt;
&lt;br /&gt;
== Updating the Properties File in Admin Web Applications ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Note that updating the WAR artifact is not necessary to perform properties file changes when using an external properties file as described [[Advanced_Configuration#Properties_File|here]].&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you need to change [[Advanced_Configuration#Properties_File|configuration properties]] for a standalone admin web application or combined scheduler and admin web application, follow these steps:&lt;br /&gt;
&lt;br /&gt;
# Obtain the WAR artifact from your installation that requires changes. This is either &amp;lt;code&amp;gt;obsidian.war&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;standaloneObsidianAdmin.war&amp;lt;/code&amp;gt;.&lt;br /&gt;
# Extract the WAR file to a clean directory.&lt;br /&gt;
# Edit the &amp;lt;code&amp;gt;com.carfey.(yaml/properties)&amp;lt;/code&amp;gt; file within the subdirectory &amp;lt;code&amp;gt;WEB-INF/classes&amp;lt;/code&amp;gt; and save your changes.&lt;br /&gt;
# Rebundled the WAR artifact using a zip utility or the JDK &amp;lt;code&amp;gt;jar&amp;lt;/code&amp;gt; utility.&lt;br /&gt;
#* Some zip utilities such as 7Zip will allow you to edit files within an archive directly without the previous steps. It is generally safe to do so.&lt;br /&gt;
&lt;br /&gt;
= Deployment =&lt;br /&gt;
&lt;br /&gt;
You are now ready to deploy your scheduler and/or admin web application.&lt;br /&gt;
&lt;br /&gt;
== Embedded Scheduler ==&lt;br /&gt;
&lt;br /&gt;
When Obsidian is embedded, there is no separate deployment process. However, you will need to start and stop Obsidian with your application. If you are using Spring, we recommend you use our [[Spring Integration]] instead, which will automatically start and stop the scheduler for you.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
During your application startup, once it is fully initialized (or as close as possible), start Obsidian, and save a reference to the returned result so you can shut it down later:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// This will start the scheduler on the first call to get().&lt;br /&gt;
&lt;br /&gt;
com.carfey.ops.job.SchedulerStarter starter = com.carfey.ops.job.SchedulerStarter.get(com.carfey.ops.job.SchedulerStarter.SchedulerMode.EMBEDDED);&lt;br /&gt;
&lt;br /&gt;
// ...&lt;br /&gt;
&lt;br /&gt;
// Later, we need to gracefully shut down the scheduler &lt;br /&gt;
starter.shutDown();&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This will run Obsidian&#039;s scheduler process, but will not include any of the web application or the REST API. This functionality is provided by the admin web application.&lt;br /&gt;
&lt;br /&gt;
== Standalone Admin Web Application ==&lt;br /&gt;
&lt;br /&gt;
To deploy the standalone admin web application, simply deploy the &amp;lt;code&amp;gt;standaloneObsidianAdmin.war&amp;lt;/code&amp;gt; file your servlet container of choice (e.g. Tomcat) after configuring it appropriately. You may rename the WAR file to have it deployed under a different context path, if desired (e.g. &amp;quot;ROOT.war&amp;quot; or &amp;quot;obsidian.war&amp;quot;). Consult your servlet documentation to find out how to deploy the application and start the servlet container.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; If you want to use the included Jetty server as your servlet container, you can use the scripts included in your installation instead of deploying the WAR. This will make the application accessible at http://localhost:8080.&lt;br /&gt;
* To start &lt;br /&gt;
** Linux: &amp;lt;code&amp;gt;./webObsidian.sh start adminOnly&amp;lt;/code&amp;gt;&lt;br /&gt;
** Windows: &amp;lt;code&amp;gt;webObsidian.bat start adminOnly&amp;lt;/code&amp;gt;&lt;br /&gt;
* To stop&lt;br /&gt;
** Linux: &amp;lt;code&amp;gt;./webObsidian.sh stop&amp;lt;/code&amp;gt; &lt;br /&gt;
** Windows: &amp;lt;code&amp;gt;webObsidian.bat stop&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Security Note:&#039;&#039;&#039; By default, the admin web application allows non-secure connections. If you wish to force secure connections through HTTPS, you can edit the web.xml in your war and uncomment the &amp;lt;security-constraint&amp;gt; element in the file. This will force all requests to redirect to an encrypted connection. For details on setting up SSL on your servlet container, refer to its documentation.&lt;br /&gt;
&lt;br /&gt;
== Standalone Scheduler ==&lt;br /&gt;
&lt;br /&gt;
To deploy and run the standalone scheduler, you may use the provided scripts in your installation directory:&lt;br /&gt;
* Linux: &amp;lt;code&amp;gt;./standaloneObsidian.sh start&amp;lt;/code&amp;gt;&lt;br /&gt;
* Windows: &amp;lt;code&amp;gt;standaloneObsidian.bat start&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
You should always stop Obsidian gracefully when possible by using:&lt;br /&gt;
* Linux: &amp;lt;code&amp;gt;./standaloneObsidian.sh stop&amp;lt;/code&amp;gt;&lt;br /&gt;
* Windows: &amp;lt;code&amp;gt;standaloneObsidian.bat stop&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Both the start and stop commands may be supplied an additional argument to override the &amp;lt;code&amp;gt;listenerPort&amp;lt;/code&amp;gt; which defaults to 10451.&lt;br /&gt;
&lt;br /&gt;
Rather than use one of the provided scripts, you can invoke the equivalent Java command:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
java com.carfey.ops.job.SchedulerStarter start &amp;lt;listenerPort&amp;gt;&lt;br /&gt;
java com.carfey.ops.job.SchedulerStarter stop &amp;lt;listenerPort&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Combined Scheduler and Admin Web Application ==&lt;br /&gt;
&lt;br /&gt;
To deploy the combined scheduler and admin web application, simply deploy the &amp;lt;code&amp;gt;obsidian.war&amp;lt;/code&amp;gt; file your servlet container of choice (e.g. Tomcat) after configuring it appropriately. You may rename the WAR file to have it deployed under a different context path, if desired (e.g. &amp;quot;ROOT.war&amp;quot;). Consult your servlet documentation to find out how to deploy the application and start the servlet container.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; If you want to use the included Jetty server as your servlet container, you can use the scripts included in your installation instead of deploying the WAR.  This will make the web application accessible at the URL http://localhost:8080.&lt;br /&gt;
&lt;br /&gt;
* To start &lt;br /&gt;
** Linux: &amp;lt;code&amp;gt;./webObsidian.sh start scheduler&amp;lt;/code&amp;gt;&lt;br /&gt;
** Windows: &amp;lt;code&amp;gt;webObsidian.bat start scheduler&amp;lt;/code&amp;gt;&lt;br /&gt;
* To stop&lt;br /&gt;
** Linux: &amp;lt;code&amp;gt;./webObsidian.sh stop&amp;lt;/code&amp;gt; &lt;br /&gt;
** Windows: &amp;lt;code&amp;gt;webObsidian.bat stop&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Security Note:&#039;&#039;&#039; By default, the admin web application allows non-secure connections. If you wish to force secure connections through HTTPS, you can edit the web.xml in your war and uncomment the &amp;lt;security-constraint&amp;gt; element in the file. This will force all requests to redirect to an encrypted connection. For details on setting up SSL on your servlet container, refer to its documentation.&lt;br /&gt;
&lt;br /&gt;
== Embedding the Obsidian Web Application in Another Web Application ==&lt;br /&gt;
&lt;br /&gt;
We do not generally recommend attempting to merge the Obsidian admin web application with another servlet web application, but it can be done by following these steps:&lt;br /&gt;
&lt;br /&gt;
To embed the full Obsidian web application in an existing web application, you will need to extract the necessary sections from the &amp;lt;code&amp;gt;WEB-INF/web.xml&amp;lt;/code&amp;gt; file in the &amp;lt;code&amp;gt;obsidian.war&amp;lt;/code&amp;gt; file and merge them into your application&#039;s &amp;lt;code&amp;gt;web.xml&amp;lt;/code&amp;gt; file. This includes all &amp;quot;listener&amp;quot;, &amp;quot;servlet&amp;quot;, &amp;quot;servlet-mapping&amp;quot;, &amp;quot;jsp-config&amp;quot;, &amp;quot;filter&amp;quot;, &amp;quot;filter-mapping&amp;quot; elements, and optionally &amp;quot;welcome-file-list&amp;quot; and &amp;quot;error-page&amp;quot; elements. Ensure that all servlet paths are maintained. If you are using a different servlet specification version, you may need to update the mappings to the appropriate format.&lt;br /&gt;
&lt;br /&gt;
Note the use of our &amp;lt;code&amp;gt;com.carfey.ops.servlet.StartupShutdownListener&amp;lt;/code&amp;gt; which takes care of starting up the scheduler instance and using the web container&#039;s default shutdown mechanism to ensure graceful shutdown. This listener will start Obsidian&#039;s scheduler process and initialize the Obsidian web application. &lt;br /&gt;
&lt;br /&gt;
If you wish to embed Obsidian&#039;s web application without the scheduler running, include the following parameter element in your &amp;lt;code&amp;gt;web.xml&amp;lt;/code&amp;gt;:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&amp;lt;context-param&amp;gt;&lt;br /&gt;
   &amp;lt;param-name&amp;gt;schedulerEnabled&amp;lt;/param-name&amp;gt;&lt;br /&gt;
   &amp;lt;param-value&amp;gt;false&amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Additional Deployment Details ==&lt;br /&gt;
&lt;br /&gt;
=== Classpath Notes ===&lt;br /&gt;
&lt;br /&gt;
To run a scheduler with your custom code and jobs, you need to ensure the scheduler process classpath includes your code packaged into JAR files, as described [[#Embedding_Obsidian_.26_Customizing_Artifacts|above]]. &lt;br /&gt;
&lt;br /&gt;
If a compiled job is updated, you will have to restart your application or the servlet container after deploying updated jars, unless you are using [[Job Forking]].&lt;br /&gt;
&lt;br /&gt;
=== Setting Host Names ===&lt;br /&gt;
Obsidian instances will automatically assign themselves host names if no host name is explicitly set, but you may wish to give them explicit names to make scheduling and monitoring simpler.&lt;br /&gt;
&lt;br /&gt;
If you wish to assign explicit names, simply set the Java system property &amp;lt;code&amp;gt;schedulerDesignation&amp;lt;/code&amp;gt; to the host name of your choice. For example, if starting an instance using the standalone scheduler using &amp;lt;code&amp;gt;java&amp;lt;/code&amp;gt; directly, simply add the value &amp;lt;code&amp;gt;-DschedulerDesignation=myHostName&amp;lt;/code&amp;gt; to the end of the command.&lt;br /&gt;
&lt;br /&gt;
You may also use a properties file setting for the host name as detailed in [[Advanced Configuration]].&lt;br /&gt;
&lt;br /&gt;
=== Disabling Automatic Database Updates ===&lt;br /&gt;
&lt;br /&gt;
Obsidian automatically applies schema updates and data upgrades to its database on startup. In some cases, it may be desirable to disable this once the database has been fully initialized and upgrades to new versions are not going to be deployed. For example, you may wish to run Obsidian with a user who does not have privileges to modify the database schema.&lt;br /&gt;
&lt;br /&gt;
To do so, you can either set a Java system property, or if you are using the admin web application WAR, you can add a setting to your &amp;lt;code&amp;gt;WEB-INF/web.xml&amp;lt;/code&amp;gt; within the archive.&lt;br /&gt;
&lt;br /&gt;
As a system property:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
-DstartupRunnerClass=com.carfey.ops.run.NullRunner&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In &amp;lt;code&amp;gt;WEB-INF/web.xml&amp;lt;/code&amp;gt;, after any &amp;lt;code&amp;gt;listener&amp;lt;/code&amp;gt; elements:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;context-param&amp;gt;&lt;br /&gt;
    &amp;lt;param-name&amp;gt;startupRunnerClass&amp;lt;/param-name&amp;gt;&lt;br /&gt;
    &amp;lt;param-value&amp;gt;com.carfey.ops.run.NullRunner&amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Disabling DDL Updates ===&lt;br /&gt;
&lt;br /&gt;
It may also be helpful to apply schema updates (DDL) outside Obsidian through a privileged account, but allow Obsidian upgrades to make the necessary data initialization/modifications. This can be done using a &#039;&#039;&#039;skipDDL&#039;&#039;&#039; configuration property documented under [[Advanced_Configuration#Miscellaneous_Properties | Advanced Configuration]].&lt;br /&gt;
&lt;br /&gt;
=== Disabling Job Scheduling in the Web Application ===&lt;br /&gt;
&lt;br /&gt;
If you have combined scheduler and admin web application WAR already built, you can easily tweak it to disable the scheduler process. &lt;br /&gt;
&lt;br /&gt;
Simply add the following to your &amp;lt;code&amp;gt;WEB-INF/web.xml&amp;lt;/code&amp;gt; within the WAR archive after any &amp;lt;code&amp;gt;listener&amp;lt;/code&amp;gt; elements:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;context-param&amp;gt;&lt;br /&gt;
    &amp;lt;param-name&amp;gt;schedulerEnabled&amp;lt;/param-name&amp;gt;&lt;br /&gt;
    &amp;lt;param-value&amp;gt;false&amp;lt;/param-value&amp;gt;&lt;br /&gt;
&amp;lt;/context-param&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= You’re Good to Go! =&lt;br /&gt;
&lt;br /&gt;
You&#039;re now ready to log into the web application and start scheduling jobs! The URL you use to access Obsidian will depend on how it&#039;s been deployed, but will typically be something like http://localhost/obsidian, or http://localhost/standadminObsidianAdmin.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Default User:&#039;&#039;&#039; Each Obsidian installation using native authentication starts with a single default user named &#039;&#039;admin&#039;&#039; with password &#039;&#039;changeme&#039;&#039;. You should change this after your first log in. See [[Admin_User_Management|User Management]] for how to change a user&#039;s password.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
At this point we suggest you play around with the admin web application. Many screens offer inline help. Otherwise, you can refer to our [[Admin Web Application Guide]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To get started writing jobs that you can run in Obsidian, see [[Implementing_Jobs|Implementing Jobs]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
See the &#039;&#039;&#039;[[User Guide]]&#039;&#039;&#039; if you have questions or wish to explore what Obsidian offers.&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Upgrading_Obsidian&amp;diff=4069</id>
		<title>Upgrading Obsidian</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Upgrading_Obsidian&amp;diff=4069"/>
		<updated>2026-07-09T19:22:24Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;There are a number of options available to you. Select the one that best suits your situation.&lt;br /&gt;
&lt;br /&gt;
Note that you don&#039;t necessarily need to go through the installer UI again, although you&#039;re free to do so. Since the primary purpose of the installer is to provide fully configured Obsidian artifacts and your environment would already be configured, you really just need the updated artifacts (libraries and WAR files). Even if you want to take advantage of new configuration options, you could use the [[Advanced_Configuration|Configuration Reference]] to make the necessary changes.&lt;br /&gt;
&lt;br /&gt;
=== Upgrading to 7.0.0 ===&lt;br /&gt;
&lt;br /&gt;
==== Remember Me removal ====&lt;br /&gt;
&lt;br /&gt;
The Remember Me feature has been removed. No operator action is required. On first startup after the upgrade, &#039;&#039;Release7Dot0Dot0Upgrader&#039;&#039; runs automatically and drops the &#039;&#039;USER_COOKIE&#039;&#039; table (if it exists) and removes the &#039;&#039;allowRememberMe&#039;&#039; system parameter. Users who had active Remember Me sessions will be prompted to log in on their next visit.&lt;br /&gt;
&lt;br /&gt;
==== OAuth / OIDC authentication (optional) ====&lt;br /&gt;
&lt;br /&gt;
Obsidian 7.0.0 adds an optional OAuth / OIDC authenticator. Existing installations continue to use their current authenticator (DB or LDAP) with no changes required. To switch to OAuth / OIDC: configure &#039;&#039;OAuthAuthenticator&#039;&#039; properties in the Obsidian configuration file (&#039;&#039;com.carfey.properties&#039;&#039; or YAML equivalent) — see [[Authenticator#OAuthAuthenticator_(OIDC_SSO)]] and [[Advanced_Configuration#OAuth_/_OIDC_Authentication_Properties]] — then restart Obsidian.&lt;br /&gt;
&lt;br /&gt;
==== Migrating saved automated install XML (Obsidian 6 → 7) ====&lt;br /&gt;
&lt;br /&gt;
If you use headless / automated install with an XML file saved from Obsidian 6 (IzPack 4.3.5), you must migrate that file before installing with Obsidian 7. Unzip the Obsidian 7.0.0 download and run the migrate helper (Windows: &#039;&#039;&#039;migrate-headless.bat --in my-old-config.xml --out my-config-izpack5.xml&#039;&#039;&#039;, Unix: &#039;&#039;&#039;migrate-headless.sh&#039;&#039;&#039; with the same arguments, or &#039;&#039;&#039;java -jar Obsidian-Install-Migrate.jar --in my-old-config.xml --out my-config-izpack5.xml&#039;&#039;&#039;). Review &#039;&#039;&#039;my-config-izpack5.xml.migration-report.txt&#039;&#039;&#039; only if the tool creates one — if it lists unknown panels or keys, contact [[Support|Carfey support]]. Then install with the migrated file: &#039;&#039;&#039;java -jar Obsidian-Install-7.0.0.jar my-config-izpack5.xml&#039;&#039;&#039;. The migrate helper covers Obsidian&#039;s standard installer panels only and does not modify product installer descriptors or custom installers.&lt;br /&gt;
&lt;br /&gt;
==== Installer breaking changes (Obsidian 6 → 7) ====&lt;br /&gt;
&lt;br /&gt;
* Headless automated install XML must use IzPack 5 panel class names and &#039;&#039;id&#039;&#039; attributes — migrate saved Obsidian 6 files with the tooling above.&lt;br /&gt;
* GUI installer — same configuration panels and outcomes; underlying engine is IzPack 5.&lt;br /&gt;
* Release zip — adds migrate JAR/scripts.&lt;br /&gt;
* Groovy and Flexmark libraries are now modular — see [[Advanced_Configuration#Dependent_Libraries]].&lt;br /&gt;
&lt;br /&gt;
== Automated Installer File ==&lt;br /&gt;
This section applies if you have saved an automated installer XML file from a previous version of Obsidian.&lt;br /&gt;
&lt;br /&gt;
If the release notes do not document any installer incompatibility between source and target releases, this means there are no new configuration options available and you can use your automated installer file without modification.  &lt;br /&gt;
&lt;br /&gt;
You can see [[Installation_Guide#Completing_the_Installation|installation configuration]] for more information, but essentially all you need to do is run &amp;lt;code&amp;gt;java -jar Obsidian-Install-n-n-n.jar my-obsidian-install-config.xml&amp;lt;/code&amp;gt;. You may wish to change the target installation path before proceeding.&lt;br /&gt;
&lt;br /&gt;
If the release notes do document installer incompatibility between releases, follow the relevant instructions to update your installer configuration file and then follow the same procedure.&lt;br /&gt;
&lt;br /&gt;
== Existing Configuration ==&lt;br /&gt;
&lt;br /&gt;
You have a choice when it comes to upgrading an Obsidian environment that is already configured.&lt;br /&gt;
&lt;br /&gt;
# You can rerun the installer UI to get the configured artifacts.&lt;br /&gt;
# Use the [[Installation_Guide#Running_the_Obsidian_Installer|quickstart]] installation mode to get the updated artifacts with the quickstart configuration.&lt;br /&gt;
&lt;br /&gt;
==== Existing Configuration with QuickStart ====&lt;br /&gt;
If you are using [[Advanced_Configuration#Properties.2FYaml_File|overrides]] support to specify &#039;&#039;&#039;ALL&#039;&#039;&#039; your configuration items, you likely are ready to go as the default configuration items are being overridden.&lt;br /&gt;
&lt;br /&gt;
Otherwise, you are relying at least partially on embedded configuration items. You will need to replace the quickstart configuration values with your existing configuration values. The Obsidian WAR files have the &amp;lt;code&amp;gt;com.carfey.(properties/yaml)&amp;lt;/code&amp;gt; file inside at &amp;lt;code&amp;gt;WEB-INF/classes/com.carfey.(properties/yaml)&amp;lt;/code&amp;gt; and the standalone installation has it at the root of &#039;&#039;obsidian-properties-configuration.jar&#039;&#039; or &#039;&#039;obsidian-yaml-configuration.jar&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Performing the Upgrade ==&lt;br /&gt;
We highly recommend performing a database backup and an installation backup (filesystem backup) prior to performing the upgrade with rollback strategies in place to restore the previous installation with its data.&lt;br /&gt;
&lt;br /&gt;
Obsidian automatically applies any database modifications during the first deployment of the new version.&lt;br /&gt;
&lt;br /&gt;
The simplest mechanism is to bring down all your Obsidian Scheduler nodes during a quiet scheduling period. Deploy the new artifacts and start the each node individually verifying its startup before proceeding to the next node.&lt;br /&gt;
&lt;br /&gt;
== Database Upgrade Scripts ==&lt;br /&gt;
&#039;&#039;Available as of version 3.0&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When you start Obsidian, it will automatically upgrade the schema in your target database. However, if you wish to run Obsidian with a database user without create and drop privileges, or simply wish to prepare your database structure ahead of time, you can use the database upgrade scripts provided with your download zip file under the &amp;quot;db_scripts&amp;quot; directory.&lt;br /&gt;
&lt;br /&gt;
First locate all files named &amp;quot;*upgrade.sql&amp;quot; under the directory for the database you are using under the &amp;quot;db_scripts&amp;quot; directory. Statements within these files contain the token &amp;quot;$px$&amp;quot; to enable table prefixes. Before you run the SQL files, replace all instances of the token &amp;quot;$px$&amp;quot; (without quotes) with a table prefix 6 characters or shorter (letters and underscores supported), or with blank.&lt;br /&gt;
&lt;br /&gt;
Then, in your SQL client of choice, execute the scripts in order of their version numbers. This will upgrade your schema to your target version.&lt;br /&gt;
&lt;br /&gt;
You&#039;ll need to allow the data portion of the migrations to execute while preventing the DDL scripts to run. To do this, you need to [[Getting_Started#Disabling_DDL_Updates|disable DDL Updates]].&lt;br /&gt;
&lt;br /&gt;
== Performing an Always On Cluster Upgrade ==&lt;br /&gt;
&lt;br /&gt;
If you absolutely must maintain at least one node running, Obsidian should be able to continue scheduling and executing on a single node while the other(s) is/are upgraded although we make no assurances and recommend that you &#039;&#039;&#039;test out your specific upgrade scenario&#039;&#039;&#039; first. Depending on the content between source and target releases, we also recommend that you don&#039;t attempt to perform other changes such as job configuration changes, failure resubmissions, etc. during this time. Feel free to [[Contact_the_Obsidian_Scheduler_Team|contact us]] with questions about your specific upgrade scenario.&lt;br /&gt;
&lt;br /&gt;
===== Always On Cluster Upgrade Steps =====&lt;br /&gt;
# Bring down all but one Obsidian Scheduler node. &lt;br /&gt;
# Target a downed node for upgrade.&lt;br /&gt;
# Deploy the upgraded artifacts to the targeted downed node.&lt;br /&gt;
# Startup the upgraded node.&lt;br /&gt;
# Verify successful startup.&lt;br /&gt;
# Bring down the still-running older Obsidian Scheduler node.&lt;br /&gt;
# Repeat steps 3-5 for each remaining downed node in the cluster.&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Authenticator&amp;diff=4068</id>
		<title>Authenticator</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Authenticator&amp;diff=4068"/>
		<updated>2026-07-09T19:17:22Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Obsidian ships with three built-in authenticators: native (database), LDAP, and OAuth (OIDC). A custom authenticator can also be implemented by extending the authenticator interface. The active authenticator is selected by the &#039;&#039;com.carfey.suite.security.Authenticator&#039;&#039; property in the Obsidian configuration file (&#039;&#039;com.carfey.properties&#039;&#039; or YAML equivalent).&lt;br /&gt;
&lt;br /&gt;
== OAuthAuthenticator (OIDC SSO) ==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;OAuthAuthenticator&#039;&#039; enables Single Sign-On via any OIDC-compliant identity provider. It implements OAuth 2.0 Authorization Code + PKCE (S256). Full configuration reference: [[Advanced_Configuration#OAuth_/_OIDC_Authentication_Properties|Advanced Configuration — OAuth / OIDC Authentication Properties]].&lt;br /&gt;
&lt;br /&gt;
=== How browser login works ===&lt;br /&gt;
&lt;br /&gt;
When &#039;&#039;OAuthAuthenticator&#039;&#039; is active, the Obsidian login page shows a single &amp;quot;Sign in with &amp;lt;displayName&amp;gt;&amp;quot; button instead of a username/password form. Clicking the button redirects the user to the identity provider&#039;s login page. After successful authentication at the IdP, the browser is redirected back to Obsidian with an authorization code. Obsidian exchanges the code for tokens at the IdP token endpoint and validates the id_token signature, issuer, audience, expiry, and nonce. &lt;br /&gt;
&lt;br /&gt;
No Obsidian database user record is created or required. Identity and roles come entirely from the validated token.&lt;br /&gt;
&lt;br /&gt;
=== User identity and display ===&lt;br /&gt;
&lt;br /&gt;
Obsidian uses the &#039;&#039;sub&#039;&#039; claim of the id_token as the stable internal user ID (stored in audit logs and session state). The &#039;&#039;sub&#039;&#039; claim is IdP-guaranteed unique and is never reassigned. A separate &#039;&#039;claim.displayName&#039;&#039;  property (default: &#039;&#039;preferred_username&#039;&#039;) controls what name appears in the Obsidian UI nav bar. Changing &#039;&#039;claim.displayName&#039;&#039; does not affect audit logging.&lt;br /&gt;
&lt;br /&gt;
=== Roles from IdP groups ===&lt;br /&gt;
&lt;br /&gt;
After the code exchange, Obsidian reads a configured groups claim from the id_token (or access token, or userinfo endpoint). Each group value is mapped to an Obsidian role via indexed &#039;&#039;role.&amp;lt;idx&amp;gt;.group&#039;&#039; / &#039;&#039;role.&amp;lt;idx&amp;gt;.roleName&#039;&#039; properties. At least one mapping to the &#039;&#039;Admin&#039;&#039; role is required. A user whose groups do not match any mapping authenticates successfully but has no access to role-gated actions (same behavior as a DB/LDAP user with no assigned roles).&lt;br /&gt;
&lt;br /&gt;
Valid Obsidian roles: &#039;&#039;&#039;Admin&#039;&#039;&#039;, &#039;&#039;&#039;API&#039;&#039;&#039;, &#039;&#039;&#039;Write&#039;&#039;&#039;, &#039;&#039;&#039;LimitedRead&#039;&#039;&#039;, &#039;&#039;&#039;Operator&#039;&#039;&#039;, &#039;&#039;&#039;Author&#039;&#039;&#039;, and folder-based roles following the &#039;&#039;&amp;lt;folder&amp;gt;-(Write|Author|Operator)&#039;&#039; convention (e.g. &#039;&#039;Maintenance-Author&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
=== REST API Bearer authentication ===&lt;br /&gt;
&lt;br /&gt;
REST clients can authenticate to Obsidian&#039;s REST API using a signed JWT access token in the &#039;&#039;Authorization: Bearer &amp;lt;token&amp;gt;&#039;&#039; header. Obsidian validates the token locally using cached JWKS keys. The userinfo endpoint is not called on the Bearer path. The client must have the &#039;&#039;API&#039;&#039; Obsidian role.&lt;br /&gt;
&lt;br /&gt;
=== Logout modes ===&lt;br /&gt;
&lt;br /&gt;
Two logout modes are supported: &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;local&#039;&#039;&#039; (default) — Obsidian invalidates its own session. The IdP session remains active (useful for SSO environments where other applications share the IdP session).&lt;br /&gt;
* &#039;&#039;&#039;rp&#039;&#039;&#039; — RP-initiated logout. Obsidian redirects the browser to the IdP&#039;s &#039;&#039;end_session_endpoint&#039;&#039;, which terminates the IdP session. Requires the IdP to expose &#039;&#039;end_session_endpoint&#039;&#039; in its discovery document.&lt;br /&gt;
&lt;br /&gt;
=== v1 limitations ===&lt;br /&gt;
&lt;br /&gt;
* Opaque (non-JWT) access tokens are not supported on the REST/Bearer path.&lt;br /&gt;
* No &#039;&#039;jti&#039;&#039; replay protection (mitigate with short token lifetimes at the IdP).&lt;br /&gt;
* Microsoft Entra multi-tenant apps are not supported.&lt;br /&gt;
* No post-login IdP session validity check (mitigate with a short session timeout in &#039;&#039;web.xml&#039;&#039;).&lt;br /&gt;
* Dynamic role map (&#039;&#039;dynamicRole.prefix&#039;&#039;/&#039;&#039;suffix&#039;&#039;) requires a server restart when new root job folders are added.&lt;br /&gt;
* Installer UI supports up to 10 static group→role pairs; the runtime supports unlimited.&lt;br /&gt;
&lt;br /&gt;
== Developing an Authenticator ==&lt;br /&gt;
Obsidian uses any valid implementation of the &amp;lt;code&amp;gt;com.carfey.suite.security.Authenticator&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;com.carfey.suite.security.remember.Authenticator&amp;lt;/code&amp;gt; interface. &lt;br /&gt;
&lt;br /&gt;
=== Implementation of a Custom Authenticator ===&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;com.carfey.suite.security.User authenticate(String username, String pass) throws com.carfey.suite.security.Authenticator.AuthenticationFailedException&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
As of Obsidian 6.1.1, you may optionally implement REST authentication distinctly. Defaults to standard authentication when not implemented.&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;com.carfey.suite.security.User authenticateREST(String username, String pass) throws com.carfey.suite.security.Authenticator.AuthenticationFailedException&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This method authenticates and returns a user with roles defined. Given a user name and a password either return a valid &amp;lt;code&amp;gt;com.carfey.suite.security.User&amp;lt;/code&amp;gt; object or throw a &amp;lt;code&amp;gt;com.carfey.suite.security.Authenticator.AuthenticationFailedException&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If authentication is successful, the &amp;lt;code&amp;gt;com.carfey.suite.security.User&amp;lt;/code&amp;gt; returned must have all its role memberships defined. This is done using the &amp;lt;code&amp;gt;com.carfey.suite.security.Role&amp;lt;/code&amp;gt; class. The assignment of &amp;lt;code&amp;gt;Role&amp;lt;/code&amp;gt;s to a &amp;lt;code&amp;gt;User&amp;lt;/code&amp;gt; can be done using any of the public constructors/setters or logical combination thereof defined below.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&amp;lt;code&amp;gt;public boolean supportsRememberMe()&amp;lt;/code&amp;gt;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
from &amp;lt;code&amp;gt;com.carfey.suite.security.remember.Authenticator&amp;lt;/code&amp;gt; available as of Obsidian 3.5.0.&lt;br /&gt;
&lt;br /&gt;
This method, from &amp;lt;code&amp;gt;com.carfey.suite.security.remember.Authenticator&amp;lt;/code&amp;gt;, indicates whether the Authenticator supports Obsidian&#039;s remember me feature available in the Web Admin login. This is primarily used to ensure the remember me feature is not exposed in environments where the user could be disabled, made inactive or otherwise invalidated while allowing a lookup to succeed - as may be the case in directory authentication implementations such as LDAP.&lt;br /&gt;
&lt;br /&gt;
=== Users ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
public User(String userId)&lt;br /&gt;
&lt;br /&gt;
public User(String userId, Set&amp;lt;Role&amp;gt; roles, String firstName, String lastName, String email, boolean active*)&lt;br /&gt;
&lt;br /&gt;
public User(String userId, List&amp;lt;Role&amp;gt; roles, String firstName, String lastName, String email, boolean active*)&lt;br /&gt;
&lt;br /&gt;
public void setRoles(Set&amp;lt;Role&amp;gt; roles)&lt;br /&gt;
&lt;br /&gt;
public void setRoles(List&amp;lt;Role&amp;gt; roles)&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&#039;&#039;* Note: If you wish to implement active user enabling/disabling, you must do so in your &amp;lt;code&amp;gt;Authenticator&amp;lt;/code&amp;gt; throwing &amp;lt;code&amp;gt;com.carfey.suite.security.Authenticator.AuthenticationFailedException&amp;lt;/code&amp;gt; when inactive users attempt to login.&lt;br /&gt;
&lt;br /&gt;
=== Roles ===&lt;br /&gt;
There are convenience constants that you should use in defining your role memberships. They can be found at &amp;lt;code&amp;gt;com.carfey.ops.Constant&amp;lt;/code&amp;gt;. The constants are &amp;lt;code&amp;gt;ADMIN_ROLE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;WRITE_ROLE&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;LIMITED_READ_ROLE&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;API_ROLE&amp;lt;/code&amp;gt;. As of &#039;&#039;5.0.0&#039;&#039;, you can also use &amp;lt;code&amp;gt;OPERATOR_ROLE&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;AUTHOR_ROLE&amp;lt;/code&amp;gt;. &#039;&#039;Default&#039;&#039; rights are assumed for any authenticated user. Therefore, if someone authenticates that should not have access, throw a &amp;lt;code&amp;gt;com.carfey.suite.security.Authenticator.AuthenticationFailedException&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
When assigning the user&#039;s &amp;lt;code&amp;gt;com.carfey.suite.security.Role&amp;lt;/code&amp;gt;s, use the constructor &amp;lt;code&amp;gt;public Role(String roleId, String roleName)&amp;lt;/code&amp;gt; using the appropriate constant for both the &amp;lt;code&amp;gt;roleId&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;roleName&amp;lt;/code&amp;gt;. Role meanings are defined in [[Admin_User_Management#User_Rights | User Rights]].&lt;br /&gt;
&lt;br /&gt;
=== Putting it All Together ===&lt;br /&gt;
&lt;br /&gt;
Finance attempts to log in to Obsidian, gives valid credentials but should not be accessing Obsidian.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import static com.carfey.ops.Constant.*;&lt;br /&gt;
&lt;br /&gt;
import com.carfey.suite.security.Authenticator.AuthenticationFailedException;&lt;br /&gt;
import com.carfey.suite.security.Role;&lt;br /&gt;
import com.carfey.suite.security.User;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public User authenticate(String username, String pass) throws AuthenticationFailedException {&lt;br /&gt;
    //usernameis &amp;quot;financeGuy&amp;quot;&lt;br /&gt;
    //pass is &amp;quot;mystrongpass&amp;quot;&lt;br /&gt;
    //credentials are valid, but user does not have any rights to Obsidian&lt;br /&gt;
&lt;br /&gt;
    throw new AuthenticationFailedException(String.format(&amp;quot;User [%s] is not authorized to use Obsidian Scheduler.&amp;quot;, username));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fred logs in using his username &#039;&#039;fredScheduler&#039;&#039; and his password &#039;&#039;badpass&#039;&#039;. You determine that his password is invalid.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
import static com.carfey.ops.Constant.*;&lt;br /&gt;
&lt;br /&gt;
import com.carfey.suite.security.Authenticator.AuthenticationFailedException;&lt;br /&gt;
import com.carfey.suite.security.Role;&lt;br /&gt;
import com.carfey.suite.security.User;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
public User authenticate(String username, String pass) throws AuthenticationFailedException {&lt;br /&gt;
    //usernameis &amp;quot;fredScheduler&amp;quot;&lt;br /&gt;
    //pass is &amp;quot;badpass&amp;quot;&lt;br /&gt;
    //credentials are invalid&lt;br /&gt;
&lt;br /&gt;
    throw new AuthenticationFailedException(String.format(&amp;quot;User [%s] could not be authenticated.&amp;quot;, username));&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Fred logs in using his username &#039;&#039;fredScheduler&#039;&#039; and his password &#039;&#039;mystrongpassword&#039;&#039;. You determine that his password is valid and matches with the user and he has &#039;&#039;WRITE_ROLE&#039;&#039; rights.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
public User authenticate(String username, String pass) throws AuthenticationFailedException {&lt;br /&gt;
    //usernameis &amp;quot;fredScheduler&amp;quot;&lt;br /&gt;
    //pass is &amp;quot;mystrongpassword&amp;quot;&lt;br /&gt;
    //credentials are valid, he has WRITE_ROLE&lt;br /&gt;
&lt;br /&gt;
    User user = new User(username);&lt;br /&gt;
    user.setRoles(Arrays.asList(new Role(WRITE_ROLE, WRITE_ROLE)));&lt;br /&gt;
    return user;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Tina logs in using her username &#039;&#039;tinaOperator&#039;&#039; and her password &#039;&#039;mystrongpassword&#039;&#039;. You determine that her password is valid and matches with the user and she has &#039;&#039;Default&#039;&#039; rights.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
public User authenticate(String username, String pass) throws AuthenticationFailedException {&lt;br /&gt;
    //usernameis &amp;quot;tinaOperator&amp;quot;&lt;br /&gt;
    //pass is &amp;quot;mystrongpassword&amp;quot;&lt;br /&gt;
    //credentials are valid, Tina has default access&lt;br /&gt;
&lt;br /&gt;
    return new User(username);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The intern logs in using his username &#039;&#039;newGuy&#039;&#039; and his password &#039;&#039;mystrongpassword&#039;&#039;. You determine that his password is valid and matches with the user and he has &#039;&#039;LIMITED_READ_ROLE&#039;&#039; rights.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
public User authenticate(String username, String pass) throws AuthenticationFailedException {&lt;br /&gt;
    //usernameis &amp;quot;newGuy&amp;quot;&lt;br /&gt;
    //pass is &amp;quot;mystrongpassword&amp;quot;&lt;br /&gt;
    //credentials are valid, the intern has LIMITED_READ_ROLE access&lt;br /&gt;
&lt;br /&gt;
    User user = new User(username);&lt;br /&gt;
    user.setRoles(Arrays.asList(new Role(LIMITED_READ_ROLE, LIMITED_READ_ROLE)));&lt;br /&gt;
    return user;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The new hire logs in using her username &#039;&#039;newHire&#039;&#039; and her password is &#039;&#039;i am a new hire&#039;&#039;. You determine that her password is valid and matches with the user and she has &#039;&#039;OPERATOR_ROLE&#039;&#039; rights only for the job folder roots &#039;&#039;DevOps&#039;&#039; and &#039;&#039;FinOps&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
 private static final String DEV_OPS_OPERATOR = &amp;quot;DevOps-&amp;quot; + OPERATOR_ROLE;&lt;br /&gt;
 private static final String FIN_OPS_OPERATOR = &amp;quot;FinOps-&amp;quot; + OPERATOR_ROLE;&lt;br /&gt;
 public User authenticate(String username, String pass) throws AuthenticationFailedException {&lt;br /&gt;
     //usernameis &amp;quot;newHire&amp;quot;&lt;br /&gt;
     //pass is &amp;quot;i am a new hire&amp;quot;&lt;br /&gt;
     //credentials are valid, the new hire has OPERATOR_ROLE access for job folder roots &#039;&#039;DevOps&#039;&#039; and &#039;&#039;FinOps&#039;&#039;&lt;br /&gt;
 &lt;br /&gt;
    User user = new User(username);&lt;br /&gt;
    user.setRoles(Arrays.asList(new Role(DEV_OPS_OPERATOR, DEV_OPS_OPERATOR), new Role(FIN_OPS_OPERATOR, FIN_OPS_OPERATOR)));&lt;br /&gt;
    return user;&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
== Customizing our LDAP Authenticator ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;com.carfey.suite.security.LdapAuthenticator&amp;lt;/code&amp;gt; is Obsidian&#039;s LDAP Authentication class that, when combined with its configurability that is documented [[Advanced_Configuration#Configuration_Details|here]], meets most needs. But with the large variety of LDAP servers and potential implementations of &#039;&#039;dn&#039;&#039; strings, role and group definition and membership and even authentication methods supported, you may need to tweak its use somewhat. Rather than require you to write your own LDAP Authenticator, we have made efforts to make ours flexible enough to be specialized.&lt;br /&gt;
&lt;br /&gt;
=== Specialization points ===&lt;br /&gt;
====&amp;lt;code&amp;gt;protected void buildUpContextEnvironment(String pass, String dn, Hashtable&amp;lt;String, String&amp;gt; environment)&amp;lt;/code&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Stores needed environment attributes for authentication using &amp;lt;code&amp;gt;javax.naming.directory.InitialDirContext&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Currently stores:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Context.INITIAL_CONTEXT_FACTORY, &amp;quot;com.sun.jndi.ldap.LdapCtxFactory&amp;quot;&lt;br /&gt;
Context.PROVIDER_URL, {{ldap_url}} &lt;br /&gt;
Context.SECURITY_AUTHENTICATION, &amp;quot;simple&amp;quot; //or overridden securityAuthentication by configuration com.carfey.suite.security.LdapAuthenticator.securityAuthentication &lt;br /&gt;
Context.SECURITY_PRINCIPAL, {{user_dn}} &lt;br /&gt;
Context.SECURITY_CREDENTIALS, {{user_pass}}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
====&amp;lt;code&amp;gt;protected boolean isMemberOfGroup(DirContext authContext, String groupName, String dn) throws NamingException&amp;lt;/code&amp;gt;====&lt;br /&gt;
&lt;br /&gt;
Checks the authenticated &amp;lt;code&amp;gt;DirContext&amp;lt;/code&amp;gt; for group membership. Used to determine &#039;&#039;Default&#039;&#039; rights to Obsidian, in addition to its defined rights [[Admin_User_Management#User_Rights|roles]]. Currently queries &amp;lt;code&amp;gt;&amp;quot;uniquemember&amp;quot;&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;&amp;quot;uniqueMember&amp;quot;&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;&amp;quot;member&amp;quot;&amp;lt;/code&amp;gt;,&amp;lt;code&amp;gt;&amp;quot;roleOccupant&amp;quot;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;&amp;quot;memberOf&amp;quot;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;quot;MemberOf&amp;quot;&amp;lt;/code&amp;gt; attributes for any match on the &#039;&#039;dn&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Deploying your Authenticator ==&lt;br /&gt;
Once your authenticator class is written, you need to deploy the compiled class and any dependent libraries to your admin web application instances as JAR files. These should be placed under the &amp;lt;code&amp;gt;/WEB-INF/lib&amp;lt;/code&amp;gt; directory of either the Obsidian web application directory or WAR file.&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Advanced_Configuration&amp;diff=4067</id>
		<title>Advanced Configuration</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Advanced_Configuration&amp;diff=4067"/>
		<updated>2026-07-09T19:07:09Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Obsidian requires some initial configuration parameters for database connection information and desired authentication mechanisms.  The installer takes care of configuring these as provided.  For your reference should you wish to manually create/edit these, note the details below.&lt;br /&gt;
&lt;br /&gt;
== Configuration Details ==&lt;br /&gt;
&lt;br /&gt;
The following sections show the available properties and sample values that can be used in the &amp;lt;code&amp;gt;com.carfey.properties&amp;lt;/code&amp;gt; properties file. While properties format is shown, all the same configuration items apply to yaml support. See [[#Properties.2FYaml_File|Properties/Yaml File]] for more details on this file.&lt;br /&gt;
&lt;br /&gt;
=== Authentication Properties ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Comment out the native authenticator setup&lt;br /&gt;
#com.carfey.suite.security.Authenticator=com.carfey.suite.security.DBAuthenticator&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== LDAP Authentication Properties ====&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#Set your LDAP info here&lt;br /&gt;
com.carfey.suite.security.Authenticator=com.carfey.suite.security.LdapAuthenticator&lt;br /&gt;
# As of Obsidian 2.1.1, you can specify the attribute type used in building up the distinguished name (dn). If unspecified, defaults to cn&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.dn.attribute=uid&lt;br /&gt;
# As of Obsidian 4.5.0, you can provide a delimited list (delimiter is 3 tildes ~~~) of dn.bases to search.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.dn.base=ou=people,o=MyOrgHere&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.url=ldap://localhost:10389&lt;br /&gt;
# As of Obsidian 2.1.1, you can specify the SECURITY_AUTHENTICATION. Defaults to simple. &lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.securityAuthentication=simple&lt;br /&gt;
# Any necessary additional information such as Provider, Principal and Host will need to be handled in your custom class extending LdapAuthenticator.&lt;br /&gt;
&lt;br /&gt;
# As of Obsidian 3.5.1, you can login via an LDAP attribute that is not part of the dn. A matching entry is found in the LDAP Directory (using anonymous or a fixed lookup account) &lt;br /&gt;
# after which the dn attribute above is retrieved to perform the user&#039;s authentication. The following 5 attributes are only used for this type of lookup and authentication.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.lookupDnAttribute=false&lt;br /&gt;
# As of Obsidian 3.5.1, this is the attribute name that is being searched for in the LDAP directory to build the dn for eventual authentication.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.loginAttribute=sAMAccountName&lt;br /&gt;
# As of Obsidian 3.5.1, this determines if these lookups will be done anonymously (without a session authenticated by user/password)&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.anonymousEnabled=false&lt;br /&gt;
# As of Obsidian 3.5.1, if anonymous lookups are not permitted or desired, provide the dn and password to be used for lookups. Typically, a read-only account with &lt;br /&gt;
# read rights to the LDAP entries and attributes in question is sufficient.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.searchUserFullDn=cn=ObsidianLDAPReadOnly,ou=people,o=MyOrgHere&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.searchPassword=password&lt;br /&gt;
# As of Obsidian 4.5.1, an alternate search base configuration parameter is used for the searchUser&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.searchUserDnBase=ou=people,o=MyOrgHere&lt;br /&gt;
# As of Obsidian 4.7.1, you may specify one or more additional group membership attributes beyond the defaults&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.groupMembershipAttribute=businessGroup~~~departmentName&lt;br /&gt;
&lt;br /&gt;
# Configure who may access the web app, based on LDAP group membership&lt;br /&gt;
# As of Obsidian 4.5.0, you can provide a delimited list (delimiter is 3 tildes ~~~) of groups to search.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.accessDN=cn=SchedulerAccess,ou=groups,o=MyOrgHere&lt;br /&gt;
&lt;br /&gt;
# Configure the Write role used in the admin web app, based on LDAP group membership (by default, users may only read)&lt;br /&gt;
# As of Obsidian 4.5.0, you can provide a delimited list (delimiter is 3 tildes ~~~) of groups to search.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.write.dn=cn=SchedulerWrite,ou=groups,o=MyOrgHere&lt;br /&gt;
# No need to alter this&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.write.roleName=Write&lt;br /&gt;
&lt;br /&gt;
# Configure the Admin role used in the admin web app, based on LDAP group membership (users may configure system parameters, etc).&lt;br /&gt;
# As of Obsidian 4.5.0, you can provide a delimited list (delimiter is 3 tildes ~~~) of groups to search.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.admin.dn=cn=SchedulerAdmin,ou=groups,o=MyOrgHere&lt;br /&gt;
# No need to alter this&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.admin.roleName=Admin&lt;br /&gt;
&lt;br /&gt;
# Configure the LimitedRead role used in the admin web app, based on LDAP group membership (by default, users may only read)&lt;br /&gt;
# As of Obsidian 4.5.0, you can provide a delimited list (delimiter is 3 tildes ~~~) of groups to search.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.limitedRead.dn=cn=SchedulerLimitedRead,ou=groups,o=MyOrgHere&lt;br /&gt;
# No need to alter this&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.limitedRead.roleName=LimitedRead&lt;br /&gt;
&lt;br /&gt;
# Configure the APIrole used by the REST API, based on LDAP group membership&lt;br /&gt;
# As of Obsidian 4.5.0, you can provide a delimited list (delimiter is 3 tildes ~~~) of groups to search.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.api.dn=cn=SchedulerAPI,ou=groups,o=MyOrgHere&lt;br /&gt;
# No need to alter this&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.api.roleName=API&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== OAuth / OIDC Authentication Properties ====&lt;br /&gt;
&lt;br /&gt;
To use OAuth / OIDC SSO, set the &#039;&#039;Authenticator&#039;&#039; property to&lt;br /&gt;
&#039;&#039;com.carfey.suite.security.OAuthAuthenticator&#039;&#039; and add the properties below. All&lt;br /&gt;
properties are prefixed with &#039;&#039;com.carfey.suite.security.OAuthAuthenticator.&#039;&#039; (shown&lt;br /&gt;
without prefix in the table for brevity).&lt;br /&gt;
&lt;br /&gt;
===== Required properties =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Property !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;issuer&#039;&#039; || OIDC Issuer URL. Obsidian fetches &#039;&#039;&amp;lt;issuer&amp;gt;/.well-known/openid-configuration&#039;&#039; lazily on first use and caches it.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;clientId&#039;&#039; || Client ID registered at the IdP.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;clientSecret&#039;&#039; || Client secret. Keep out of version control.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;redirectUri&#039;&#039; || Exact callback URL registered at the IdP (e.g. &#039;&#039;https://app.example.com/oauth/callback&#039;&#039;).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;scopes&#039;&#039; || Space-separated OAuth scopes (e.g. &#039;&#039;openid profile email groups&#039;&#039;). Must include &#039;&#039;openid&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;claim.groups&#039;&#039; || Name of the token claim that carries group memberships (e.g. &#039;&#039;groups&#039;&#039;).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;role.&amp;lt;idx&amp;gt;.group&#039;&#039; || IdP group value for this mapping. &#039;&#039;&amp;lt;idx&amp;gt;&#039;&#039; is an arbitrary stable label (numeric or descriptive).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;role.&amp;lt;idx&amp;gt;.roleName&#039;&#039; || Obsidian role for this mapping. At least one &#039;&#039;Admin&#039;&#039; mapping is required. Valid roles: &#039;&#039;&#039;Admin&#039;&#039;&#039;, &#039;&#039;&#039;API&#039;&#039;&#039;, &#039;&#039;&#039;Write&#039;&#039;&#039;, &#039;&#039;&#039;LimitedRead&#039;&#039;&#039;, &#039;&#039;&#039;Operator&#039;&#039;&#039;, &#039;&#039;&#039;Author&#039;&#039;&#039;, and folder-based roles (&#039;&#039;&amp;lt;folder&amp;gt;-(Write|Author|Operator)&#039;&#039;).&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Optional properties =====&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Property !! Default !! Description&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;displayName&#039;&#039; || (none) || Label on the SSO button: &amp;quot;Sign in with &#039;&#039;&amp;lt;displayName&amp;gt;&#039;&#039;&amp;quot;. Defaults to &amp;quot;Sign in with SSO&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;logout.mode&#039;&#039; || &#039;&#039;local&#039;&#039; || &#039;&#039;local&#039;&#039;: invalidates Obsidian session only. &#039;&#039;rp&#039;&#039;: RP-initiated logout via IdP &#039;&#039;end_session_endpoint&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;postLogoutRedirectUri&#039;&#039; || (none) || Where to redirect after RP-initiated logout. Ignored when &#039;&#039;logout.mode=local&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;claim.user&#039;&#039; || &#039;&#039;sub&#039;&#039; || Claim used as the internal user ID in audit logs. &#039;&#039;&#039;Strongly recommend keeping as &#039;&#039;sub&#039;&#039;&#039;&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;claim.displayName&#039;&#039; || &#039;&#039;preferred_username&#039;&#039; || Claim shown in the Obsidian UI nav bar. Separate from &#039;&#039;claim.user&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;claim.validateTyp&#039;&#039; || &#039;&#039;true&#039;&#039; || When &#039;&#039;true&#039;&#039;, rejects Bearer tokens where &#039;&#039;typ&#039;&#039; is present but not &#039;&#039;at+JWT&#039;&#039;. Set &#039;&#039;false&#039;&#039; only for legacy IdPs that omit &#039;&#039;typ&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;clockSkewSeconds&#039;&#039; || &#039;&#039;60&#039;&#039; || Clock skew tolerance for &#039;&#039;exp&#039;&#039;/&#039;&#039;nbf&#039;&#039; validation (seconds).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;metadata.ttlHours&#039;&#039; || &#039;&#039;24&#039;&#039; || OIDC discovery document cache TTL in hours.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;expectedAccessTokenAudience&#039;&#039; || &#039;&#039;clientId&#039;&#039; || Expected &#039;&#039;aud&#039;&#039; for Bearer access tokens. See security note below.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;claim.groupsSource&#039;&#039; || &#039;&#039;idtoken&#039;&#039; || Where to read groups during browser SSO: &#039;&#039;idtoken&#039;&#039;, &#039;&#039;accesstoken&#039;&#039;, or &#039;&#039;userinfo&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;claim.groupsBearerSource&#039;&#039; || &#039;&#039;accesstoken&#039;&#039; || Where to read groups on the Bearer path: &#039;&#039;idtoken&#039;&#039; or &#039;&#039;accesstoken&#039;&#039;. &#039;&#039;&#039;userinfo is not permitted on the Bearer path.&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;claim.groupsValuePath&#039;&#039; || (none) || Sub-field name when groups is an array of objects (e.g. &#039;&#039;name&#039;&#039;).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;claim.groupsStripPrefix&#039;&#039; || (none) || Prefix to strip from each group value (e.g. &#039;&#039;/&#039;&#039; for Keycloak full-path style).&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;claim.groupsUserinfoTimeout&#039;&#039; || &#039;&#039;5&#039;&#039; || HTTP timeout in seconds for the userinfo endpoint. Only used when &#039;&#039;claim.groupsSource=userinfo&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dynamicRole.prefix&#039;&#039; || (none) || Prefix for auto-generated folder-role group mappings. Requires &#039;&#039;dynamicRole.suffix&#039;&#039;. Map is rebuilt at startup; adding a new root folder requires a restart.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;dynamicRole.suffix&#039;&#039; || (none) || Suffix for auto-generated folder-role group mappings. Requires &#039;&#039;dynamicRole.prefix&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;requireRole&#039;&#039; || &#039;&#039;true&#039;&#039; || When &#039;&#039;true&#039;&#039;, browser SSO fails if IdP groups map to no Obsidian roles. Does not apply to REST Bearer tokens.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===== Security notes =====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;expectedAccessTokenAudience and cross-JWT confusion&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
When &#039;&#039;expectedAccessTokenAudience&#039;&#039; is not set it defaults to &#039;&#039;clientId&#039;&#039;. In many OIDC&lt;br /&gt;
configurations the id_token also carries &#039;&#039;aud=clientId&#039;&#039;, which could allow an id_token&lt;br /&gt;
to be submitted as a Bearer token. The &#039;&#039;claim.validateTyp=true&#039;&#039; default mitigates this&lt;br /&gt;
for compliant IdPs (access tokens carry &#039;&#039;typ=at+JWT&#039;&#039;; id_tokens carry &#039;&#039;typ=JWT&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
For maximum defence, set &#039;&#039;expectedAccessTokenAudience&#039;&#039; to a distinct resource-server&lt;br /&gt;
identifier if your IdP supports it.&lt;br /&gt;
&lt;br /&gt;
If &#039;&#039;claim.validateTyp=false&#039;&#039; AND &#039;&#039;expectedAccessTokenAudience&#039;&#039; is not explicitly set,&lt;br /&gt;
Obsidian logs a mandatory startup WARN advising you to set &#039;&#039;expectedAccessTokenAudience&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
===== Keycloak example =====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
com.carfey.suite.security.Authenticator=com.carfey.suite.security.OAuthAuthenticator&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.issuer=http://localhost:8081/realms/obsidian&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.clientId=obsidian-client&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.clientSecret=test-client-secret-local&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.redirectUri=http://localhost:8080/oauth/callback&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.scopes=openid profile email groups&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.claim.groups=groups&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.claim.groupsSource=idtoken&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.role.1.group=Obsidian-Admins&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.role.1.roleName=Admin&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.role.2.group=Obsidian-Write&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.role.2.roleName=Write&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.role.3.group=Obsidian-Read&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.role.3.roleName=LimitedRead&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.role.4.group=Obsidian-API&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.role.4.roleName=API&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.displayName=Keycloak&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.logout.mode=local&lt;br /&gt;
com.carfey.suite.security.OAuthAuthenticator.requireRole=true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===== Provider notes =====&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Microsoft Entra ID&#039;&#039;&#039;: groups claim contains GUIDs by default; configure Optional&lt;br /&gt;
Claims for display names. Accounts with 200+ groups trigger overage. Multi-tenant apps not&lt;br /&gt;
supported in v1.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Auth0&#039;&#039;&#039;: opaque access tokens (Auth0 default) are not supported on the Bearer path.&lt;br /&gt;
Configure a custom API audience to get JWT access tokens.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Okta&#039;&#039;&#039;: use the Custom Authorization Server URL, not the Org Authorization Server.&lt;br /&gt;
&lt;br /&gt;
===== v1 limitations =====&lt;br /&gt;
&lt;br /&gt;
* Opaque access tokens not supported on the REST/Bearer path.&lt;br /&gt;
* No &#039;&#039;jti&#039;&#039; replay protection.&lt;br /&gt;
* Microsoft Entra multi-tenant apps not supported.&lt;br /&gt;
* No post-login IdP session validity check.&lt;br /&gt;
* Dynamic role map requires restart for new root folders.&lt;br /&gt;
* Installer UI supports up to 10 static role pairs; runtime supports unlimited.&lt;br /&gt;
&lt;br /&gt;
=== SMTP Mail Properties ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Email configuration for notifications, if desired&lt;br /&gt;
#for straight up open relay, just specify the host using&lt;br /&gt;
mail.smtp.host=smtp.myopenrelayhost.com&lt;br /&gt;
mail.smtp.port=port &lt;br /&gt;
#(standard ports are 25, 465 for SSL, 587 for TLS)&lt;br /&gt;
&lt;br /&gt;
#for using TLS and SSL, provide these as necessary&lt;br /&gt;
mail.smtp.socketFactory.port=port&lt;br /&gt;
mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory&lt;br /&gt;
mail.smtp.auth=true&lt;br /&gt;
mail.smtp.user=myauthenticatedemailuser@email.com&lt;br /&gt;
mail.smtp.password=PASSWORD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# As of Obsidian 2.5.0, we support JNDI lookups for email sessions. All other email properties can be excluded.&lt;br /&gt;
mail.session.jndi.path=java:comp/env/mail/session&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Database Properties ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Database configuration&lt;br /&gt;
com.carfey.obsidian.db.url=jdbc:mysql://localhost/obsidian&lt;br /&gt;
com.carfey.obsidian.db.userId=user&lt;br /&gt;
com.carfey.obsidian.db.password=pass&lt;br /&gt;
&lt;br /&gt;
# Sample JDBC URL formats for all platforms&lt;br /&gt;
#com.carfey.obsidian.db.url=jdbc:mysql://localhost:3306/obsidian&lt;br /&gt;
#com.carfey.obsidian.db.url=jdbc:h2:C:/dev/workspace/obsidian;MVCC=TRUE&lt;br /&gt;
#com.carfey.obsidian.db.url=jdbc:oracle:thin:@localhost:1521:obsidian&lt;br /&gt;
#com.carfey.obsidian.db.url=jdbc:postgresql://localhost:5432/obsidian&lt;br /&gt;
#com.carfey.obsidian.db.url=jdbc:sqlserver://localhost:1433;databaseName=obsidian&lt;br /&gt;
&lt;br /&gt;
# As of Obsidian 6.3.0, we support constructing simple JDBC urls from component properties&lt;br /&gt;
# Only supports basic URL formats noted above and does not support H2&lt;br /&gt;
#com.carfey.obsidian.db.host=localhost&lt;br /&gt;
#com.carfey.obsidian.db.port=3306&lt;br /&gt;
#com.carfey.obsidian.db.databaseName=obsidianDB&lt;br /&gt;
#com.carfey.obsidian.db.dbType=mariadb/mysql/oracle/postgresql/sqlserver&lt;br /&gt;
#com.carfey.obsidian.db.oracleSid=SIDORCL&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
# As of Obsidian 2.5.0, we support JNDI lookups for database connectivity.&lt;br /&gt;
com.carfey.obsidian.db.url=java:comp/env/jdbc/obsidian&lt;br /&gt;
com.carfey.obsidian.db.jndiType=mysql&lt;br /&gt;
#com.carfey.obsidian.db.jndiType=mysql is also used for MariaDB&lt;br /&gt;
#com.carfey.obsidian.db.jndiType=oracle&lt;br /&gt;
#com.carfey.obsidian.db.jndiType=postgresql&lt;br /&gt;
#com.carfey.obsidian.db.jndiType=h2&lt;br /&gt;
#com.carfey.obsidian.db.jndiType=sqlserver&lt;br /&gt;
&lt;br /&gt;
# Table prefix may be used to add a prefix to tables and related database objects. It must be 6 or fewer characters and can contain letters or underscores. Available as of version 2.0.&lt;br /&gt;
com.carfey.obsidian.db.tablePrefix=OBSDN_&lt;br /&gt;
&lt;br /&gt;
# For Oracle databases, when Obsidian&#039;s tables exist in a different schema from the user specified above, or if the user does not default to the schema matching its name, specify the target schema here. Available as of version 2.1.&lt;br /&gt;
# For details on the required privileges to run with an alternate user, see https://wiki.obsidianscheduler.com/docs/Obsidian_Tables#Oracle_Privileges&lt;br /&gt;
# This same configuration item can be used to configure the Postgresql schema. If unspecified, the default is public. Available as of Obsidian 2.1.1. &lt;br /&gt;
# If using JNDI and Oracle/Postgresql, we recommend you set this value to ensure best performance.&lt;br /&gt;
com.carfey.obsidian.db.schema=obsidian&lt;br /&gt;
&lt;br /&gt;
#default max connections per pool if not specified is 50&lt;br /&gt;
com.carfey.obsidian.db.maxConnections=40&lt;br /&gt;
&lt;br /&gt;
#default millis timeout to retrieve available connection from pool if not specified is 2000&lt;br /&gt;
com.carfey.obsidian.db.connectionTimeout=2000&lt;br /&gt;
&lt;br /&gt;
# As of 3.4.0, you can disable pooling of connections, which is suggested only if using another connection pool through JNDI. When true, maxConnections is ignored. &lt;br /&gt;
# When a JNDI data source is selected in the installer, this is set to true by default.&lt;br /&gt;
com.carfey.obsidian.db.disablePooling=true&lt;br /&gt;
&lt;br /&gt;
# As of 4.3.0, Oracle database supports configured wait time.&lt;br /&gt;
com.carfey.obsidian.db.timedLockWaitEnabled=true (default)&lt;br /&gt;
com.carfey.obsidian.db.timedLockWaitSeconds=1 (default, prior to 4.3.0, indefinite wait)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Logging Properties ===&lt;br /&gt;
As of &#039;&#039;&#039;Obsidian 5.0.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Please see [https://logging.apache.org/log4j/2.x/manual/configuration.html Log4j2 configuration]&lt;br /&gt;
&lt;br /&gt;
Before &#039;&#039;&#039;Obsidian 5.0.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Please see [https://logging.apache.org/log4j/1.2/manual.html Log4j Configuration]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Miscellaneous Properties ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# If you wish to change the tokens used to reference global parameters in your job configuration, use the following two values:&lt;br /&gt;
global.param.start.token={{&lt;br /&gt;
global.param.end.token=}}&lt;br /&gt;
&lt;br /&gt;
# Populated by the installer, these values can be used to initialize licence key information into the database.&lt;br /&gt;
com.carfey.obsidian.licence.key=licenceKey&lt;br /&gt;
# Name is only required for hardware-linked or site licenses. Use the name exactly as provided by Carfey Software Corporation in your license email.&lt;br /&gt;
com.carfey.obsidian.licence.name=licenceeName&lt;br /&gt;
&lt;br /&gt;
# As of 2.8.0, if you have issues with classloading (e.g. in Grails or Spring), this flag enables usage of the context classloader .&lt;br /&gt;
com.carfey.jdk.useContextClassLoader=true&lt;br /&gt;
&lt;br /&gt;
# As of 2.9.0, you can set the scheduler host designator name multiple times in the same JVM by using this parameter:&lt;br /&gt;
com.carfey.obsidian.schedulerDesignation=obsidian-dev&lt;br /&gt;
&lt;br /&gt;
# As of 3.0.0, Job Forking can be enabled and configured per node&lt;br /&gt;
com.carfey.obsidian.jvmJobForkingEnabledOnThisNode=true&lt;br /&gt;
# This property is the location of the fork scripts. Obsidian is bundled with obsidianForkedJob.bat and obsidianForkedJob.sh. These are the expected script names.&lt;br /&gt;
com.carfey.obsidian.forkedJobScriptLocation=/Obsidian-3.0.0&lt;br /&gt;
# Use the following optional property if you need to override the default classpath that is built using the contents of the standalone directory.&lt;br /&gt;
# This allows for job forking support in embedded and even webapp deployments. Use the classpath format supported by your operating system.&lt;br /&gt;
#com.carfey.obsidian.forkedJobscriptClasspathOverride=&lt;br /&gt;
# Use the following optional property if you wish to include database configuration parameters as arguments passed to the forking scripts and the target forked Obsidian class.&lt;br /&gt;
# For example, you may need to do this if your configuration is done via System Property overrides or programmmatically in your embedded Obsidian instance.&lt;br /&gt;
#com.carfey.obsidian.jvmJobForkingIncludeDbSysParms=true&lt;br /&gt;
&lt;br /&gt;
# Obsolete as of 4.0.0. As of 3.4.0, the base URL used to resolve links in the Obsidian web app can be overridden. This is typically only required when a load balancer or proxy is used to access Obsidian.&lt;br /&gt;
com.carfey.obsidian.baseHrefUrl=http://myhost:8080/obsidian&lt;br /&gt;
&lt;br /&gt;
# As of 4.3.0, description/parameter formatting is supported. Custom formatter (com.carfey.ops.job.config.formatter.Formatter) supported via this parameter.&lt;br /&gt;
com.carfey.obsidian.formatterClass=com.carfey.ops.job.config.formatter.MarkdownFormatter (default)&lt;br /&gt;
&lt;br /&gt;
# As of 4.4.0, support for running DDL outside Obsidian and applying only the data portion of upgrades. May require incremental upgrades. Contact support for assistance. Enabled with the following:&lt;br /&gt;
com.carfey.obsidian.runner.skipDDL=true&lt;br /&gt;
&lt;br /&gt;
# As of 4.5.0, Slack notifications can be automatically configured for FATAL, ERROR and WARN events by setting this property with a Slack incoming web hook URL. The user name property is optional and defaults to Obsidian Scheduler&lt;br /&gt;
com.carfey.obsidian.slack.webhookUrl=https://hooks.slack.com/services/XXXXXXX/YYYYYYYY/ZZZZZZZZZZ&lt;br /&gt;
com.carfey.obsidian.slack.userName=Obsidian Scheduler (prod)&lt;br /&gt;
&lt;br /&gt;
# As of 4.6.0, Obsidian supports starting a node in paused state. This can also be set as a System property.&lt;br /&gt;
com.carfey.obsidian.schedulerPausedOnStartup=true&lt;br /&gt;
&lt;br /&gt;
# As of 4.10.0, Obsidian supports disabling script engine jobs selectively.&lt;br /&gt;
com.carfey.ops.job.script.BeanShellJob.enabled=true&lt;br /&gt;
com.carfey.ops.job.script.GroovyJob.enabled=true&lt;br /&gt;
com.carfey.ops.job.script.RubyJob.enabled=true&lt;br /&gt;
com.carfey.ops.job.script.PythonJob.enabled=true&lt;br /&gt;
com.carfey.ops.job.script.JavaScriptJob.enabled=true&lt;br /&gt;
&lt;br /&gt;
# As of 5.0.0, Signal interrupt (supported as of 4.5.1) is disabled by default. Use configuration to enable.&lt;br /&gt;
com.carfey.obsidian.signalHandlerActiveForScheduler=true&lt;br /&gt;
&lt;br /&gt;
# As of 5.2.0, you can send Obsidian events to a REST endpoint via an out-of-the-box Event Hook. The basicAuthorization property is optional, the sample showing its use for myusername:mypassword. The &amp;quot;Basic &amp;quot; prefix is added by Obsidian.&lt;br /&gt;
com.carfey.obsidian.restfulEventHook.url=https://myendpoint.com:1234/rest/obsidian_events&lt;br /&gt;
com.carfey.obsidian.restfulEventHook.basicAuthorization=bXl1c2VybmFtZTpteXBhc3N3b3Jk&lt;br /&gt;
&lt;br /&gt;
# As of 5.2.1, maintenance jobs are automatically scheduled for new installations. Set the following property to disable this behaviour.&lt;br /&gt;
com.carfey.obsidian.skipMaintenanceJobInitialization=true&lt;br /&gt;
&lt;br /&gt;
# As of 5.2.1, you can send Obsidian events to standard output and error streams using an out-of-the-box Event Hook. You can enable the default behaviour and auto-register it by adding the following configuration.&lt;br /&gt;
com.carfey.obsidian.standardOutputStreamsEventHook.enabled=true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Table Prefixes ===&lt;br /&gt;
As shown in full configuration reference, a table name prefix may be specified to create Obsidian tables with names beginning with a specified string.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Table prefix may be used to add a prefix to tables and related database objects. It must be 6 or fewer characters and can contain letters or underscores. Available as of version 2.0.&lt;br /&gt;
com.carfey.obsidian.db.tablePrefix=OBSDN_&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Properties/Yaml File ==&lt;br /&gt;
&lt;br /&gt;
The above configuration must reside in a properties file named &amp;lt;code&amp;gt;com.carfey.properties&amp;lt;/code&amp;gt; or a yaml file named &amp;lt;code&amp;gt;com.carfey.yaml&amp;lt;/code&amp;gt; found according to the rules of [http://docs.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html#getResource(java.lang.String) ClassLoader.getResource].  If both yaml and properties files are found, yaml is loaded first and properties values will override. Some possibilities include &amp;lt;code&amp;gt;WEB-INF/classes/com.carfey.(properties/yaml)&amp;lt;/code&amp;gt;, a &amp;lt;code&amp;gt;com.carfey.(properties/yaml)&amp;lt;/code&amp;gt; file in a directory which is explicitly added to the classpath, or at the root of a jar file as is done in &amp;lt;code&amp;gt;obsidian-props.jar&amp;lt;/code&amp;gt; for standalone deployments. Prior to Obsidian 3.6, this file had to exist on the classpath, even if only using the override options below to configure Obsidian.&lt;br /&gt;
&lt;br /&gt;
Instead of using a classpath resource for properties, you can specify an external properties file using the Java system property &amp;lt;code&amp;gt;carfey.properties.file&amp;lt;/code&amp;gt;. All expected properties must be specified in either the default &amp;lt;code&amp;gt;com.carfey.properties&amp;lt;/code&amp;gt; file on the classpath or in the override file. Any properties found in both files will use the override file&#039;s values. Usage: &amp;lt;code&amp;gt;-Dcarfey.properties.file=/home/obsidian/obsidian.properties&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Instead of using a classpath resource for yaml, you can specify an external yaml file using the Java system property &amp;lt;code&amp;gt;carfey.yaml.file&amp;lt;/code&amp;gt;. All expected configuration values must be specified in either the default &amp;lt;code&amp;gt;com.carfey.yaml&amp;lt;/code&amp;gt; file on the classpath or in the override file. Any configuration values found in both files will use the override file&#039;s values. Usage: &amp;lt;code&amp;gt;-Dcarfey.yaml.file=/home/obsidian/obsidian.yaml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
As of Obsidian 2.1, you may also use a programmatic properties override. Simply call &amp;lt;code&amp;gt;com.carfey.jdk.sys.Configurator.setOverride(Properties props)&amp;lt;/code&amp;gt; as early as possible in the application startup.  To quote the javadoc of this method, &#039;&#039;For use as a programmatic properties override. This must be called before any classes are accessed either through invocation or class initialization that may require access to configuration done through properties. Best if done as early as possible in code, perhaps first in an entry point class that does little else and then hands-off to existing entry point.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
As of Obsidian 4.4, you may specify configuration values as System Properties or Environment Variables. Duplicated values are resolved as follows:&lt;br /&gt;
# System Property&lt;br /&gt;
# Environment Variable - &#039;&#039;&#039;&#039;&#039;overridden by System Property&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
# Properties - &#039;&#039;&#039;&#039;&#039;overridden by Environment Variable and System Property&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Notifications Configuration ==&lt;br /&gt;
&lt;br /&gt;
Sending notifications requires SMTP configuration to be defined in the Obsidian properties file. The properties file reference at the beginning of this page includes SMTP configuration details.&lt;br /&gt;
&lt;br /&gt;
In addition to the properties file, you can configure some Notifications settings to tweak how your emails are sent. These values are configurable under the &#039;&#039;Dispatch&#039;&#039; category of the [[Admin Scheduler Settings|scheduler settings]] screen. Defaults are provided, but you can update them appropriately for your needs.  &lt;br /&gt;
&lt;br /&gt;
[[File:NotifSettings_4.0.png]]&lt;br /&gt;
&lt;br /&gt;
== Dependent Libraries ==&lt;br /&gt;
&lt;br /&gt;
Obsidian Scheduler requires a number of third party libraries, both for the web administration application and the scheduler itself.  Below is information on these libraries and how they are used.  Unless otherwise noted, they are mandatory. As of Obsidian 2.5.0, our installer supports selective [[Installation_Guide#Configuring_3rd_Party_Library_Conflict_Management|conflict management]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Authentication (OAuth / OIDC)&#039;&#039;&lt;br /&gt;
All libraries in this section are only required when OAuthAuthenticator is active. &#039;&#039;&#039;As of Obsidian 7.0.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* oauth2-oidc-sdk-11.23.1.jar, nimbus-jose-jwt-10.0.2.jar. Nimbus OAuth 2.0 SDK with OpenID Connect extensions and JOSE+JWT support.&lt;br /&gt;
* content-type-2.3.jar, lang-tag-1.7.jar. Supporting libraries for the Nimbus SDK.&lt;br /&gt;
* json-smart-2.5.2.jar, accessors-smart-2.5.2.jar. JSON parsing for the Nimbus SDK.&lt;br /&gt;
* jcip-annotations-1.0-1.jar. Concurrency annotations for the Nimbus SDK.&lt;br /&gt;
* asm-9.7.1.jar. Bytecode manipulation library; transitive dependency of the Nimbus SDK.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Common&#039;&#039;&lt;br /&gt;
* obsidian.jar.  Core Obsidian lib.&lt;br /&gt;
* gson-2.10.1. Supports REST API and web administration.&lt;br /&gt;
* jmustache-1.15.jar. Provides email templating.&lt;br /&gt;
* log4j-api-2.17.0.jar, log4j-core-2.17.0.jar.  Obsidian logging uses log4j2.&lt;br /&gt;
* snakeyaml-2.3.jar. Support for YAML configuration.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Databases&#039;&#039;&lt;br /&gt;
* h2-1.4.200.jar.  H2 database and JDBC driver.  Only required for running H2.&lt;br /&gt;
* mariadb-java-client-2.7.2.jar. MySQL JDBC driver. Only required for running against MySQL or MariaDB.&lt;br /&gt;
* mssql-jdbc-9.2.1.jre11.jar. SQL Server JDBC driver.  Only required for running SQLServer.&lt;br /&gt;
* ojdbc11-21.1.0.0.jar. Oracle JDBC driver.  Only required for running Oracle.&lt;br /&gt;
* postgresql-42.2.19.jar.  PostgreSQL JDBC driver.  Only required for running PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Mail&#039;&#039; &lt;br /&gt;
* activation-1.1.jar, javax.mail-1.6.2.jar. Used for javamail (javax) email notifications.&lt;br /&gt;
* angus-activation-2.0.1.jar, angus-mail-2.0.2.jar. Optionally used with Jakarta EE email notifications.&lt;br /&gt;
* jakarta.activation-api-2.1.2.jar, jakarta.mail-api-2.1.2.jar. Used for Jakarta EE email notifications.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Scripts&#039;&#039;&lt;br /&gt;
* bsh-2.0b5.jar.  Support for our Bean Shell script execution. (http://www.beanshell.org).  Only required for BeanShellJob usage.&lt;br /&gt;
* jruby-9.2.17.0.jar. Support for Ruby script execution (https://www.jruby.org/). Only required for RubyJob usage.&lt;br /&gt;
* jython-standalone-2.7.2.jar. Support for Python script execution (https://www.jython.org/).  Only required for PythonJob usage.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Scripts - Prior to Obsidian 7.0.0:&#039;&#039;&#039;&lt;br /&gt;
Groovy scripting shipped as a single uber archive: apache-groovy-all-4.0.24.jar&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Scripts - As of Obsidian 7.0.0:&#039;&#039;&#039;&lt;br /&gt;
Groovy scripting ships as 13 modular JARs: groovy-4.0.24.jar, groovy-astbuilder-4.0.24.jar, groovy-datetime-4.0.24.jar, groovy-dateutil-4.0.24.jar, groovy-json-4.0.24.jar, groovy-jsr223-4.0.24.jar, groovy-macro-4.0.24.jar, groovy-macro-library-4.0.24.jar, groovy-nio-4.0.24.jar, groovy-sql-4.0.24.jar, groovy-templates-4.0.24.jar, groovy-typecheckers-4.0.24.jar, groovy-xml-4.0.24.jar.&lt;br /&gt;
Plus four owned transitives (included when Groovy is enabled): asm-analysis-9.7.1.jar, asm-tree-9.7.1.jar, asm-util-9.7.1.jar, javaparser-core-3.26.2.jar&lt;br /&gt;
All 17 JARs above are excluded when Groovy scripting is disabled at install time.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Web Admin&#039;&#039;&lt;br /&gt;
* dom4j-2.1.3.jar.  XML utilities.&lt;br /&gt;
* flexmark-0.62.2.jar, flexmark-util-0.62.2.jar. Markdown formatting for Description and Parameter job annotations.&lt;br /&gt;
* jxl-2.6.12.jar. Excel file format utilities. Only required in web administration.&lt;br /&gt;
* opencsv-5.4.jar. Support for CSV downloads in UI.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Web Admin - As of Obsidian 7.0.0:&#039;&#039;&#039;&lt;br /&gt;
Wiki rendering ships as 12 modular JARs:&lt;br /&gt;
flexmark-0.62.2.jar, flexmark-util-ast-0.62.2.jar, flexmark-util-builder-0.62.2.jar, flexmark-util-collection-0.62.2.jar, flexmark-util-data-0.62.2.jar, flexmark-util-dependency-0.62.2.jar, flexmark-util-format-0.62.2.jar, flexmark-util-html-0.62.2.jar, flexmark-util-misc-0.62.2.jar, flexmark-util-options-0.62.2.jar, flexmark-util-sequence-0.62.2.jar, flexmark-util-visitor-0.62.2.jar&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;As of Obsidian 7.0.0&#039;&#039;&#039;, the following changes were made:&lt;br /&gt;
* &#039;&#039;&#039;log4j upgraded&#039;&#039;&#039;: log4j-api and log4j-core updated from 2.17.1 to 2.26.0.&lt;br /&gt;
* &#039;&#039;&#039;Modular Groovy libraries&#039;&#039;&#039;: Obsidian no longer ships &#039;&#039;&#039;apache-groovy-all-4.0.24.jar&#039;&#039;&#039;. Groovy scripting now uses 13 modular JARs (see &#039;&#039;Scripts&#039;&#039; above). When Groovy is disabled at install time, all 13 modules are excluded.&lt;br /&gt;
* &#039;&#039;&#039;Modular Flexmark libraries&#039;&#039;&#039;: Obsidian no longer ships &#039;&#039;&#039;flexmark-util-0.62.2.jar&#039;&#039;&#039;. Wiki rendering now uses 12 modular Flexmark JARs (see &#039;&#039;Scripts&#039;&#039; above). &lt;br /&gt;
* &#039;&#039;&#039;OAuth / OIDC authentication libraries&#039;&#039;&#039; added (Nimbus OAuth 2.0 SDK and transitive dependencies). Required only when OAuthAuthenticator is configured. See [[Advanced_Configuration#OAuth_/_OIDC_Authentication_Properties|Authentication (OAuth/OIDC)]] above.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 6.0.0&#039;&#039;&#039;, the following library was in use.&lt;br /&gt;
* groovy-all-3.0.7.jar. Support for Groovy script execution (https://groovy-lang.org/).  Only required for GroovyJob usage.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 5.4.0&#039;&#039;&#039;, the following library was in use.&lt;br /&gt;
* gson-2.8.6.jar. Supports REST API and web administration.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 5.2.0&#039;&#039;&#039;, the following library was in use.&lt;br /&gt;
* jakarta.activation-1.2.1.jar. Used for email notifications.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 5.0.3&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* &#039;&#039;Obsidian 5.0.2&#039;&#039; log4j-api-2.16.0.jar, log4j-core-2.16.0.jar.  &lt;br /&gt;
* &#039;&#039;Obsidian 5.0.1&#039;&#039; log4j-api-2.15.0.jar, log4j-core-2.15.0.jar.  &lt;br /&gt;
* &#039;&#039;Obsidian 5.0.0&#039;&#039; log4j-api-2.14.1.jar, log4j-core-2.14.1.jar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 5.0.0&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* activation-1.1.jar, javax.mail-1.5.5.jar.  Used for email notifications.&lt;br /&gt;
* dom4j-1.6.1.jar. XML utilities.&lt;br /&gt;
* gson-2.7.jar. Supports REST API and web administration.&lt;br /&gt;
* bsh-2.0b4.jar.  Support for our Bean Shell script execution. (http://www.beanshell.org).  Only required for BeanShellJob usage.&lt;br /&gt;
* groovy-all-2.4.14.jar. Support for Groovy script execution (https://groovy-lang.org/).  Only required for GroovyJob usage.&lt;br /&gt;
* jython-standalone-2.7.0.jar. Support for Python script execution (https://www.jython.org/).  Only required for PythonJob usage.&lt;br /&gt;
* jruby-complete-9.2.7.0.jar. Support for Ruby script execution (https://www.jruby.org/). Only required for RubyJob usage.&lt;br /&gt;
* jmustache-1.12.jar. Provides email templating.&lt;br /&gt;
* h2-1.4.192.  H2 database and JDBC driver.  Only required for running H2.&lt;br /&gt;
* log4j-1.2.9.jar.  Obsidian logging uses log4j.&lt;br /&gt;
* mariadb-java-client-1.4.5.jar.  MySQL JDBC driver. Only required for running against MySQL or MariaDB.&lt;br /&gt;
* jtds-1.3.1.jar. SQL Server JDBC driver.  Only required for running SQLServer.&lt;br /&gt;
* ojdbc7-12.1.0.1.jar.  Oracle JDBC driver.  Only required for running Oracle.&lt;br /&gt;
* postgresql-9.4.1208.jre7.jar. PostgreSQL JDBC driver.  Only required for running PostgreSQL.&lt;br /&gt;
* opencsv-3.8.jar. Support for CSV downloads in UI.&lt;br /&gt;
* flexmark-0.19.6.jar, flexmark-util-0.19.6.jar (as of 4.3.0). Markdown formatting for Description and Parameter job annotations.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 4.5.1&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* groovy-all-2.4.7.jar. Support for Groovy script execution (https://groovy-lang.org/).  Only required for GroovyJob usage.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 4.0.0&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* javax.mail-1.5.2.jar.  Used for email notifications.&lt;br /&gt;
* jstl.jar, standard.jar.  Web utilities. Only required in web administration.&lt;br /&gt;
* gson-2.2.2.jar. Supports REST API and web administration.&lt;br /&gt;
* groovy-all-2.1.8.jar.  Support for Groovy script execution (https://groovy-lang.org/).  Only required for GroovyJob usage.&lt;br /&gt;
* jython-standalone-2.5.3.jar.  Support for Python script execution (https://www.jython.org/).  Only required for PythonJob usage.&lt;br /&gt;
* jmustache-1.8.jar. Provides email templating.&lt;br /&gt;
* h2-1.3.154. H2 database and JDBC driver.  Only required for running H2.&lt;br /&gt;
* mariadb-java-client-1.1.5.jar. MySQL JDBC driver. Only required for running against MySQL or MariaDB.&lt;br /&gt;
* jtds-1.2.8.jar. SQL Server JDBC driver.  Only required for running SQLServer.&lt;br /&gt;
* ojdbc6-11.2.0.3.jar. Oracle JDBC driver.  Only required for running Oracle.&lt;br /&gt;
* postgresql-9.0-801.jdbc4.jar.  PostgreSQL JDBC driver.  Only required for running PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 2.9.1&#039;&#039;&#039;, the following redundant library was in included in the Obsidian packaging.&lt;br /&gt;
* smtp.jar.  Used for email notifications.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 2.2.0&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* groovy-all-1.7.6.jar&lt;br /&gt;
* jython.jar (version 2.5.2rc2)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 2.1.1&#039;&#039;&#039;, the following libraries were also included.&lt;br /&gt;
* carfey-date-1.2.jar or carfey-date-1.1.jar.  Date math/manipulation.&lt;br /&gt;
* jdk-gen.jar, jdk.jar, suite-gen.jar, suite.jar.  Core Obsidian libs.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 2.1.0&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* ojdbc14.jar Oracle JDBC driver.  Only required for running Oracle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 1.5&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* gson-1.5.jar. Supports REST API and web administration.&lt;br /&gt;
&lt;br /&gt;
=== Required Libraries for Embedded API ===&lt;br /&gt;
&lt;br /&gt;
To use the [[Embedded_API|Embedded API]], the following resources should be imported. If you have newer versions of the same JARs in your application, feel free to use the newer version. The JAR files below can generally be found in the &#039;&#039;standalone&#039;&#039; directory if your installation. The &amp;lt;code&amp;gt;com.carfey.properties&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;com.carfey.yaml&amp;lt;/code&amp;gt; file can be extracted from the &amp;lt;code&amp;gt;obsidian-properties-configuration.jar&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;obsidian-yaml-configuration.jar&amp;lt;/code&amp;gt; in the &#039;&#039;standalone&#039;&#039; directory, or from an Obsidian WAR file under &amp;lt;code&amp;gt;WEB-INF/classes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* com.carfey.properties/com.carfey.yaml (configuration file), or obsidian-properties-configuration.jar/obsidian-yaml-configuration.jar, which contains the configuration file&lt;br /&gt;
* obsidian.jar&lt;br /&gt;
* dom4j-2.1.3.jar&lt;br /&gt;
* flexmark-0.62.2.jar, flexmark-util-0.62.2.jar&lt;br /&gt;
* gson-2.10.1&lt;br /&gt;
* log4j-api-2.17.0.jar, log4j-core-2.17.0.jar&lt;br /&gt;
* Appropriate JDBC JAR (e.g. mariadb-java-client-2.7.2.jar for MySQL or MariaDB)&lt;br /&gt;
&lt;br /&gt;
In addition, the following resources should be included if you wish to have notification support enabled when using the API:&lt;br /&gt;
* jmustache-1.15.jar&lt;br /&gt;
** jakarta.activation-api-2.1.2.jar, jakarta.mail-api-2.1.2.jar. Used for Jakarta EE email notifications.&lt;br /&gt;
** angus-activation-2.0.1.jar, angus-mail-2.0.2.jar. Optionally used with Jakarta EE email notifications.&lt;br /&gt;
** activation-1.1.jar, javax.mail-1.6.2.jar. Used for javamail (javax) email notifications.&lt;br /&gt;
&lt;br /&gt;
Finally, if you need to configure scripting jobs from the API, you will need to include any applicable JARs from the following list:&lt;br /&gt;
* apache-groovy-all-4.0.24.jar&lt;br /&gt;
* bsh-2.0b5.jar&lt;br /&gt;
* jruby-9.2.17.0.jar&lt;br /&gt;
* jython-standalone-2.7.2.jar&lt;br /&gt;
&lt;br /&gt;
== Disabling Job Execution &amp;amp; Scheduling in the Web Application ==&lt;br /&gt;
See the instructions within the [[Getting_Started#Disabling_Job_Scheduling_in_the_Web_Application|Getting Started Guide]].&lt;br /&gt;
&lt;br /&gt;
== Disabling Automatic Database Updates ==&lt;br /&gt;
See the instructions within the [[Getting_Started#Disabling_Automatic_Database_Updates|Getting Started Guide]].&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Advanced_Configuration&amp;diff=4066</id>
		<title>Advanced Configuration</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Advanced_Configuration&amp;diff=4066"/>
		<updated>2026-06-06T23:45:54Z</updated>

		<summary type="html">&lt;p&gt;Craig: /* Required Libraries for Embedded API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Obsidian requires some initial configuration parameters for database connection information and desired authentication mechanisms.  The installer takes care of configuring these as provided.  For your reference should you wish to manually create/edit these, note the details below.&lt;br /&gt;
&lt;br /&gt;
== Configuration Details ==&lt;br /&gt;
&lt;br /&gt;
The following sections show the available properties and sample values that can be used in the &amp;lt;code&amp;gt;com.carfey.properties&amp;lt;/code&amp;gt; properties file. While properties format is shown, all the same configuration items apply to yaml support. See [[#Properties.2FYaml_File|Properties/Yaml File]] for more details on this file.&lt;br /&gt;
&lt;br /&gt;
=== Authentication Properties ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Comment out the native authenticator setup&lt;br /&gt;
#com.carfey.suite.security.Authenticator=com.carfey.suite.security.DBAuthenticator&lt;br /&gt;
&lt;br /&gt;
#Set your LDAP info here&lt;br /&gt;
com.carfey.suite.security.Authenticator=com.carfey.suite.security.LdapAuthenticator&lt;br /&gt;
# As of Obsidian 2.1.1, you can specify the attribute type used in building up the distinguished name (dn). If unspecified, defaults to cn&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.dn.attribute=uid&lt;br /&gt;
# As of Obsidian 4.5.0, you can provide a delimited list (delimiter is 3 tildes ~~~) of dn.bases to search.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.dn.base=ou=people,o=MyOrgHere&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.url=ldap://localhost:10389&lt;br /&gt;
# As of Obsidian 2.1.1, you can specify the SECURITY_AUTHENTICATION. Defaults to simple. &lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.securityAuthentication=simple&lt;br /&gt;
# Any necessary additional information such as Provider, Principal and Host will need to be handled in your custom class extending LdapAuthenticator.&lt;br /&gt;
&lt;br /&gt;
# As of Obsidian 3.5.1, you can login via an LDAP attribute that is not part of the dn. A matching entry is found in the LDAP Directory (using anonymous or a fixed lookup account) &lt;br /&gt;
# after which the dn attribute above is retrieved to perform the user&#039;s authentication. The following 5 attributes are only used for this type of lookup and authentication.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.lookupDnAttribute=false&lt;br /&gt;
# As of Obsidian 3.5.1, this is the attribute name that is being searched for in the LDAP directory to build the dn for eventual authentication.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.loginAttribute=sAMAccountName&lt;br /&gt;
# As of Obsidian 3.5.1, this determines if these lookups will be done anonymously (without a session authenticated by user/password)&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.anonymousEnabled=false&lt;br /&gt;
# As of Obsidian 3.5.1, if anonymous lookups are not permitted or desired, provide the dn and password to be used for lookups. Typically, a read-only account with &lt;br /&gt;
# read rights to the LDAP entries and attributes in question is sufficient.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.searchUserFullDn=cn=ObsidianLDAPReadOnly,ou=people,o=MyOrgHere&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.searchPassword=password&lt;br /&gt;
# As of Obsidian 4.5.1, an alternate search base configuration parameter is used for the searchUser&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.searchUserDnBase=ou=people,o=MyOrgHere&lt;br /&gt;
# As of Obsidian 4.7.1, you may specify one or more additional group membership attributes beyond the defaults&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.groupMembershipAttribute=businessGroup~~~departmentName&lt;br /&gt;
&lt;br /&gt;
# Configure who may access the web app, based on LDAP group membership&lt;br /&gt;
# As of Obsidian 4.5.0, you can provide a delimited list (delimiter is 3 tildes ~~~) of groups to search.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.accessDN=cn=SchedulerAccess,ou=groups,o=MyOrgHere&lt;br /&gt;
&lt;br /&gt;
# Configure the Write role used in the admin web app, based on LDAP group membership (by default, users may only read)&lt;br /&gt;
# As of Obsidian 4.5.0, you can provide a delimited list (delimiter is 3 tildes ~~~) of groups to search.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.write.dn=cn=SchedulerWrite,ou=groups,o=MyOrgHere&lt;br /&gt;
# No need to alter this&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.write.roleName=Write&lt;br /&gt;
&lt;br /&gt;
# Configure the Admin role used in the admin web app, based on LDAP group membership (users may configure system parameters, etc).&lt;br /&gt;
# As of Obsidian 4.5.0, you can provide a delimited list (delimiter is 3 tildes ~~~) of groups to search.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.admin.dn=cn=SchedulerAdmin,ou=groups,o=MyOrgHere&lt;br /&gt;
# No need to alter this&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.admin.roleName=Admin&lt;br /&gt;
&lt;br /&gt;
# Configure the LimitedRead role used in the admin web app, based on LDAP group membership (by default, users may only read)&lt;br /&gt;
# As of Obsidian 4.5.0, you can provide a delimited list (delimiter is 3 tildes ~~~) of groups to search.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.limitedRead.dn=cn=SchedulerLimitedRead,ou=groups,o=MyOrgHere&lt;br /&gt;
# No need to alter this&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.limitedRead.roleName=LimitedRead&lt;br /&gt;
&lt;br /&gt;
# Configure the APIrole used by the REST API, based on LDAP group membership&lt;br /&gt;
# As of Obsidian 4.5.0, you can provide a delimited list (delimiter is 3 tildes ~~~) of groups to search.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.api.dn=cn=SchedulerAPI,ou=groups,o=MyOrgHere&lt;br /&gt;
# No need to alter this&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.api.roleName=API&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SMTP Mail Properties ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Email configuration for notifications, if desired&lt;br /&gt;
#for straight up open relay, just specify the host using&lt;br /&gt;
mail.smtp.host=smtp.myopenrelayhost.com&lt;br /&gt;
mail.smtp.port=port &lt;br /&gt;
#(standard ports are 25, 465 for SSL, 587 for TLS)&lt;br /&gt;
&lt;br /&gt;
#for using TLS and SSL, provide these as necessary&lt;br /&gt;
mail.smtp.socketFactory.port=port&lt;br /&gt;
mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory&lt;br /&gt;
mail.smtp.auth=true&lt;br /&gt;
mail.smtp.user=myauthenticatedemailuser@email.com&lt;br /&gt;
mail.smtp.password=PASSWORD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# As of Obsidian 2.5.0, we support JNDI lookups for email sessions. All other email properties can be excluded.&lt;br /&gt;
mail.session.jndi.path=java:comp/env/mail/session&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Database Properties ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Database configuration&lt;br /&gt;
com.carfey.obsidian.db.url=jdbc:mysql://localhost/obsidian&lt;br /&gt;
com.carfey.obsidian.db.userId=user&lt;br /&gt;
com.carfey.obsidian.db.password=pass&lt;br /&gt;
&lt;br /&gt;
# Sample JDBC URL formats for all platforms&lt;br /&gt;
#com.carfey.obsidian.db.url=jdbc:mysql://localhost:3306/obsidian&lt;br /&gt;
#com.carfey.obsidian.db.url=jdbc:h2:C:/dev/workspace/obsidian;MVCC=TRUE&lt;br /&gt;
#com.carfey.obsidian.db.url=jdbc:oracle:thin:@localhost:1521:obsidian&lt;br /&gt;
#com.carfey.obsidian.db.url=jdbc:postgresql://localhost:5432/obsidian&lt;br /&gt;
#com.carfey.obsidian.db.url=jdbc:sqlserver://localhost:1433;databaseName=obsidian&lt;br /&gt;
&lt;br /&gt;
# As of Obsidian 6.3.0, we support constructing simple JDBC urls from component properties&lt;br /&gt;
# Only supports basic URL formats noted above and does not support H2&lt;br /&gt;
#com.carfey.obsidian.db.host=localhost&lt;br /&gt;
#com.carfey.obsidian.db.port=3306&lt;br /&gt;
#com.carfey.obsidian.db.databaseName=obsidianDB&lt;br /&gt;
#com.carfey.obsidian.db.dbType=mariadb/mysql/oracle/postgresql/sqlserver&lt;br /&gt;
#com.carfey.obsidian.db.oracleSid=SIDORCL&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
# As of Obsidian 2.5.0, we support JNDI lookups for database connectivity.&lt;br /&gt;
com.carfey.obsidian.db.url=java:comp/env/jdbc/obsidian&lt;br /&gt;
com.carfey.obsidian.db.jndiType=mysql&lt;br /&gt;
#com.carfey.obsidian.db.jndiType=mysql is also used for MariaDB&lt;br /&gt;
#com.carfey.obsidian.db.jndiType=oracle&lt;br /&gt;
#com.carfey.obsidian.db.jndiType=postgresql&lt;br /&gt;
#com.carfey.obsidian.db.jndiType=h2&lt;br /&gt;
#com.carfey.obsidian.db.jndiType=sqlserver&lt;br /&gt;
&lt;br /&gt;
# Table prefix may be used to add a prefix to tables and related database objects. It must be 6 or fewer characters and can contain letters or underscores. Available as of version 2.0.&lt;br /&gt;
com.carfey.obsidian.db.tablePrefix=OBSDN_&lt;br /&gt;
&lt;br /&gt;
# For Oracle databases, when Obsidian&#039;s tables exist in a different schema from the user specified above, or if the user does not default to the schema matching its name, specify the target schema here. Available as of version 2.1.&lt;br /&gt;
# For details on the required privileges to run with an alternate user, see https://wiki.obsidianscheduler.com/docs/Obsidian_Tables#Oracle_Privileges&lt;br /&gt;
# This same configuration item can be used to configure the Postgresql schema. If unspecified, the default is public. Available as of Obsidian 2.1.1. &lt;br /&gt;
# If using JNDI and Oracle/Postgresql, we recommend you set this value to ensure best performance.&lt;br /&gt;
com.carfey.obsidian.db.schema=obsidian&lt;br /&gt;
&lt;br /&gt;
#default max connections per pool if not specified is 50&lt;br /&gt;
com.carfey.obsidian.db.maxConnections=40&lt;br /&gt;
&lt;br /&gt;
#default millis timeout to retrieve available connection from pool if not specified is 2000&lt;br /&gt;
com.carfey.obsidian.db.connectionTimeout=2000&lt;br /&gt;
&lt;br /&gt;
# As of 3.4.0, you can disable pooling of connections, which is suggested only if using another connection pool through JNDI. When true, maxConnections is ignored. &lt;br /&gt;
# When a JNDI data source is selected in the installer, this is set to true by default.&lt;br /&gt;
com.carfey.obsidian.db.disablePooling=true&lt;br /&gt;
&lt;br /&gt;
# As of 4.3.0, Oracle database supports configured wait time.&lt;br /&gt;
com.carfey.obsidian.db.timedLockWaitEnabled=true (default)&lt;br /&gt;
com.carfey.obsidian.db.timedLockWaitSeconds=1 (default, prior to 4.3.0, indefinite wait)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Logging Properties ===&lt;br /&gt;
As of &#039;&#039;&#039;Obsidian 5.0.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Please see [https://logging.apache.org/log4j/2.x/manual/configuration.html Log4j2 configuration]&lt;br /&gt;
&lt;br /&gt;
Before &#039;&#039;&#039;Obsidian 5.0.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Please see [https://logging.apache.org/log4j/1.2/manual.html Log4j Configuration]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Miscellaneous Properties ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# If you wish to change the tokens used to reference global parameters in your job configuration, use the following two values:&lt;br /&gt;
global.param.start.token={{&lt;br /&gt;
global.param.end.token=}}&lt;br /&gt;
&lt;br /&gt;
# Populated by the installer, these values can be used to initialize licence key information into the database.&lt;br /&gt;
com.carfey.obsidian.licence.key=licenceKey&lt;br /&gt;
# Name is only required for hardware-linked or site licenses. Use the name exactly as provided by Carfey Software Corporation in your license email.&lt;br /&gt;
com.carfey.obsidian.licence.name=licenceeName&lt;br /&gt;
&lt;br /&gt;
# As of 2.8.0, if you have issues with classloading (e.g. in Grails or Spring), this flag enables usage of the context classloader .&lt;br /&gt;
com.carfey.jdk.useContextClassLoader=true&lt;br /&gt;
&lt;br /&gt;
# As of 2.9.0, you can set the scheduler host designator name multiple times in the same JVM by using this parameter:&lt;br /&gt;
com.carfey.obsidian.schedulerDesignation=obsidian-dev&lt;br /&gt;
&lt;br /&gt;
# As of 3.0.0, Job Forking can be enabled and configured per node&lt;br /&gt;
com.carfey.obsidian.jvmJobForkingEnabledOnThisNode=true&lt;br /&gt;
# This property is the location of the fork scripts. Obsidian is bundled with obsidianForkedJob.bat and obsidianForkedJob.sh. These are the expected script names.&lt;br /&gt;
com.carfey.obsidian.forkedJobScriptLocation=/Obsidian-3.0.0&lt;br /&gt;
# Use the following optional property if you need to override the default classpath that is built using the contents of the standalone directory.&lt;br /&gt;
# This allows for job forking support in embedded and even webapp deployments. Use the classpath format supported by your operating system.&lt;br /&gt;
#com.carfey.obsidian.forkedJobscriptClasspathOverride=&lt;br /&gt;
# Use the following optional property if you wish to include database configuration parameters as arguments passed to the forking scripts and the target forked Obsidian class.&lt;br /&gt;
# For example, you may need to do this if your configuration is done via System Property overrides or programmmatically in your embedded Obsidian instance.&lt;br /&gt;
#com.carfey.obsidian.jvmJobForkingIncludeDbSysParms=true&lt;br /&gt;
&lt;br /&gt;
# Obsolete as of 4.0.0. As of 3.4.0, the base URL used to resolve links in the Obsidian web app can be overridden. This is typically only required when a load balancer or proxy is used to access Obsidian.&lt;br /&gt;
com.carfey.obsidian.baseHrefUrl=http://myhost:8080/obsidian&lt;br /&gt;
&lt;br /&gt;
# As of 4.3.0, description/parameter formatting is supported. Custom formatter (com.carfey.ops.job.config.formatter.Formatter) supported via this parameter.&lt;br /&gt;
com.carfey.obsidian.formatterClass=com.carfey.ops.job.config.formatter.MarkdownFormatter (default)&lt;br /&gt;
&lt;br /&gt;
# As of 4.4.0, support for running DDL outside Obsidian and applying only the data portion of upgrades. May require incremental upgrades. Contact support for assistance. Enabled with the following:&lt;br /&gt;
com.carfey.obsidian.runner.skipDDL=true&lt;br /&gt;
&lt;br /&gt;
# As of 4.5.0, Slack notifications can be automatically configured for FATAL, ERROR and WARN events by setting this property with a Slack incoming web hook URL. The user name property is optional and defaults to Obsidian Scheduler&lt;br /&gt;
com.carfey.obsidian.slack.webhookUrl=https://hooks.slack.com/services/XXXXXXX/YYYYYYYY/ZZZZZZZZZZ&lt;br /&gt;
com.carfey.obsidian.slack.userName=Obsidian Scheduler (prod)&lt;br /&gt;
&lt;br /&gt;
# As of 4.6.0, Obsidian supports starting a node in paused state. This can also be set as a System property.&lt;br /&gt;
com.carfey.obsidian.schedulerPausedOnStartup=true&lt;br /&gt;
&lt;br /&gt;
# As of 4.10.0, Obsidian supports disabling script engine jobs selectively.&lt;br /&gt;
com.carfey.ops.job.script.BeanShellJob.enabled=true&lt;br /&gt;
com.carfey.ops.job.script.GroovyJob.enabled=true&lt;br /&gt;
com.carfey.ops.job.script.RubyJob.enabled=true&lt;br /&gt;
com.carfey.ops.job.script.PythonJob.enabled=true&lt;br /&gt;
com.carfey.ops.job.script.JavaScriptJob.enabled=true&lt;br /&gt;
&lt;br /&gt;
# As of 5.0.0, Signal interrupt (supported as of 4.5.1) is disabled by default. Use configuration to enable.&lt;br /&gt;
com.carfey.obsidian.signalHandlerActiveForScheduler=true&lt;br /&gt;
&lt;br /&gt;
# As of 5.2.0, you can send Obsidian events to a REST endpoint via an out-of-the-box Event Hook. The basicAuthorization property is optional, the sample showing its use for myusername:mypassword. The &amp;quot;Basic &amp;quot; prefix is added by Obsidian.&lt;br /&gt;
com.carfey.obsidian.restfulEventHook.url=https://myendpoint.com:1234/rest/obsidian_events&lt;br /&gt;
com.carfey.obsidian.restfulEventHook.basicAuthorization=bXl1c2VybmFtZTpteXBhc3N3b3Jk&lt;br /&gt;
&lt;br /&gt;
# As of 5.2.1, maintenance jobs are automatically scheduled for new installations. Set the following property to disable this behaviour.&lt;br /&gt;
com.carfey.obsidian.skipMaintenanceJobInitialization=true&lt;br /&gt;
&lt;br /&gt;
# As of 5.2.1, you can send Obsidian events to standard output and error streams using an out-of-the-box Event Hook. You can enable the default behaviour and auto-register it by adding the following configuration.&lt;br /&gt;
com.carfey.obsidian.standardOutputStreamsEventHook.enabled=true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Table Prefixes ===&lt;br /&gt;
As shown in full configuration reference, a table name prefix may be specified to create Obsidian tables with names beginning with a specified string.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Table prefix may be used to add a prefix to tables and related database objects. It must be 6 or fewer characters and can contain letters or underscores. Available as of version 2.0.&lt;br /&gt;
com.carfey.obsidian.db.tablePrefix=OBSDN_&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Properties/Yaml File ==&lt;br /&gt;
&lt;br /&gt;
The above configuration must reside in a properties file named &amp;lt;code&amp;gt;com.carfey.properties&amp;lt;/code&amp;gt; or a yaml file named &amp;lt;code&amp;gt;com.carfey.yaml&amp;lt;/code&amp;gt; found according to the rules of [http://docs.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html#getResource(java.lang.String) ClassLoader.getResource].  If both yaml and properties files are found, yaml is loaded first and properties values will override. Some possibilities include &amp;lt;code&amp;gt;WEB-INF/classes/com.carfey.(properties/yaml)&amp;lt;/code&amp;gt;, a &amp;lt;code&amp;gt;com.carfey.(properties/yaml)&amp;lt;/code&amp;gt; file in a directory which is explicitly added to the classpath, or at the root of a jar file as is done in &amp;lt;code&amp;gt;obsidian-props.jar&amp;lt;/code&amp;gt; for standalone deployments. Prior to Obsidian 3.6, this file had to exist on the classpath, even if only using the override options below to configure Obsidian.&lt;br /&gt;
&lt;br /&gt;
Instead of using a classpath resource for properties, you can specify an external properties file using the Java system property &amp;lt;code&amp;gt;carfey.properties.file&amp;lt;/code&amp;gt;. All expected properties must be specified in either the default &amp;lt;code&amp;gt;com.carfey.properties&amp;lt;/code&amp;gt; file on the classpath or in the override file. Any properties found in both files will use the override file&#039;s values. Usage: &amp;lt;code&amp;gt;-Dcarfey.properties.file=/home/obsidian/obsidian.properties&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Instead of using a classpath resource for yaml, you can specify an external yaml file using the Java system property &amp;lt;code&amp;gt;carfey.yaml.file&amp;lt;/code&amp;gt;. All expected configuration values must be specified in either the default &amp;lt;code&amp;gt;com.carfey.yaml&amp;lt;/code&amp;gt; file on the classpath or in the override file. Any configuration values found in both files will use the override file&#039;s values. Usage: &amp;lt;code&amp;gt;-Dcarfey.yaml.file=/home/obsidian/obsidian.yaml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
As of Obsidian 2.1, you may also use a programmatic properties override. Simply call &amp;lt;code&amp;gt;com.carfey.jdk.sys.Configurator.setOverride(Properties props)&amp;lt;/code&amp;gt; as early as possible in the application startup.  To quote the javadoc of this method, &#039;&#039;For use as a programmatic properties override. This must be called before any classes are accessed either through invocation or class initialization that may require access to configuration done through properties. Best if done as early as possible in code, perhaps first in an entry point class that does little else and then hands-off to existing entry point.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
As of Obsidian 4.4, you may specify configuration values as System Properties or Environment Variables. Duplicated values are resolved as follows:&lt;br /&gt;
# System Property&lt;br /&gt;
# Environment Variable - &#039;&#039;&#039;&#039;&#039;overridden by System Property&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
# Properties - &#039;&#039;&#039;&#039;&#039;overridden by Environment Variable and System Property&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Notifications Configuration ==&lt;br /&gt;
&lt;br /&gt;
Sending notifications requires SMTP configuration to be defined in the Obsidian properties file. The properties file reference at the beginning of this page includes SMTP configuration details.&lt;br /&gt;
&lt;br /&gt;
In addition to the properties file, you can configure some Notifications settings to tweak how your emails are sent. These values are configurable under the &#039;&#039;Dispatch&#039;&#039; category of the [[Admin Scheduler Settings|scheduler settings]] screen. Defaults are provided, but you can update them appropriately for your needs.  &lt;br /&gt;
&lt;br /&gt;
[[File:NotifSettings_4.0.png]]&lt;br /&gt;
&lt;br /&gt;
== Dependent Libraries ==&lt;br /&gt;
&lt;br /&gt;
Obsidian Scheduler requires a number of third party libraries, both for the web administration application and the scheduler itself.  Below is information on these libraries and how they are used.  Unless otherwise noted, they are mandatory.&lt;br /&gt;
&lt;br /&gt;
As of Obsidian 2.5.0, our installer supports selective [[Installation_Guide#Configuring_3rd_Party_Library_Conflict_Management|conflict management]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Common&#039;&#039;&lt;br /&gt;
* obsidian.jar.  Core Obsidian lib.&lt;br /&gt;
* gson-2.10.1. Supports REST API and web administration.&lt;br /&gt;
* jmustache-1.15.jar. Provides email templating.&lt;br /&gt;
* log4j-api-2.17.0.jar, log4j-core-2.17.0.jar.  Obsidian logging uses log4j2.&lt;br /&gt;
* snakeyaml-2.3.jar. Support for YAML configuration.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Databases&#039;&#039;&lt;br /&gt;
* h2-1.4.200.jar.  H2 database and JDBC driver.  Only required for running H2.&lt;br /&gt;
* mariadb-java-client-2.7.2.jar. MySQL JDBC driver. Only required for running against MySQL or MariaDB.&lt;br /&gt;
* mssql-jdbc-9.2.1.jre11.jar. SQL Server JDBC driver.  Only required for running SQLServer.&lt;br /&gt;
* ojdbc11-21.1.0.0.jar. Oracle JDBC driver.  Only required for running Oracle.&lt;br /&gt;
* postgresql-42.2.19.jar.  PostgreSQL JDBC driver.  Only required for running PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Mail&#039;&#039; &lt;br /&gt;
* activation-1.1.jar, javax.mail-1.6.2.jar. Used for javamail (javax) email notifications.&lt;br /&gt;
* angus-activation-2.0.1.jar, angus-mail-2.0.2.jar. Optionally used with Jakarta EE email notifications.&lt;br /&gt;
* jakarta.activation-api-2.1.2.jar, jakarta.mail-api-2.1.2.jar. Used for Jakarta EE email notifications.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Scripts&#039;&#039;&lt;br /&gt;
* apache-groovy-all-4.0.24.jar. Support for Groovy script execution (https://groovy-lang.org/).  Only required for GroovyJob usage.&lt;br /&gt;
* bsh-2.0b5.jar.  Support for our Bean Shell script execution. (http://www.beanshell.org).  Only required for BeanShellJob usage.&lt;br /&gt;
* jruby-9.2.17.0.jar. Support for Ruby script execution (https://www.jruby.org/). Only required for RubyJob usage.&lt;br /&gt;
* jython-standalone-2.7.2.jar. Support for Python script execution (https://www.jython.org/).  Only required for PythonJob usage.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Web Admin&#039;&#039;&lt;br /&gt;
* dom4j-2.1.3.jar.  XML utilities.&lt;br /&gt;
* flexmark-0.62.2.jar, flexmark-util-0.62.2.jar. Markdown formatting for Description and Parameter job annotations.&lt;br /&gt;
* jxl-2.6.12.jar. Excel file format utilities. Only required in web administration.&lt;br /&gt;
* opencsv-5.4.jar. Support for CSV downloads in UI.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 6.0.0&#039;&#039;&#039;, the following library was in use.&lt;br /&gt;
* groovy-all-3.0.7.jar. Support for Groovy script execution (https://groovy-lang.org/).  Only required for GroovyJob usage.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 5.4.0&#039;&#039;&#039;, the following library was in use.&lt;br /&gt;
* gson-2.8.6.jar. Supports REST API and web administration.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 5.2.0&#039;&#039;&#039;, the following library was in use.&lt;br /&gt;
* jakarta.activation-1.2.1.jar. Used for email notifications.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 5.0.3&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* &#039;&#039;Obsidian 5.0.2&#039;&#039; log4j-api-2.16.0.jar, log4j-core-2.16.0.jar.  &lt;br /&gt;
* &#039;&#039;Obsidian 5.0.1&#039;&#039; log4j-api-2.15.0.jar, log4j-core-2.15.0.jar.  &lt;br /&gt;
* &#039;&#039;Obsidian 5.0.0&#039;&#039; log4j-api-2.14.1.jar, log4j-core-2.14.1.jar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 5.0.0&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* activation-1.1.jar, javax.mail-1.5.5.jar.  Used for email notifications.&lt;br /&gt;
* dom4j-1.6.1.jar. XML utilities.&lt;br /&gt;
* gson-2.7.jar. Supports REST API and web administration.&lt;br /&gt;
* bsh-2.0b4.jar.  Support for our Bean Shell script execution. (http://www.beanshell.org).  Only required for BeanShellJob usage.&lt;br /&gt;
* groovy-all-2.4.14.jar. Support for Groovy script execution (https://groovy-lang.org/).  Only required for GroovyJob usage.&lt;br /&gt;
* jython-standalone-2.7.0.jar. Support for Python script execution (https://www.jython.org/).  Only required for PythonJob usage.&lt;br /&gt;
* jruby-complete-9.2.7.0.jar. Support for Ruby script execution (https://www.jruby.org/). Only required for RubyJob usage.&lt;br /&gt;
* jmustache-1.12.jar. Provides email templating.&lt;br /&gt;
* h2-1.4.192.  H2 database and JDBC driver.  Only required for running H2.&lt;br /&gt;
* log4j-1.2.9.jar.  Obsidian logging uses log4j.&lt;br /&gt;
* mariadb-java-client-1.4.5.jar.  MySQL JDBC driver. Only required for running against MySQL or MariaDB.&lt;br /&gt;
* jtds-1.3.1.jar. SQL Server JDBC driver.  Only required for running SQLServer.&lt;br /&gt;
* ojdbc7-12.1.0.1.jar.  Oracle JDBC driver.  Only required for running Oracle.&lt;br /&gt;
* postgresql-9.4.1208.jre7.jar. PostgreSQL JDBC driver.  Only required for running PostgreSQL.&lt;br /&gt;
* opencsv-3.8.jar. Support for CSV downloads in UI.&lt;br /&gt;
* flexmark-0.19.6.jar, flexmark-util-0.19.6.jar (as of 4.3.0). Markdown formatting for Description and Parameter job annotations.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 4.5.1&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* groovy-all-2.4.7.jar. Support for Groovy script execution (https://groovy-lang.org/).  Only required for GroovyJob usage.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 4.0.0&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* javax.mail-1.5.2.jar.  Used for email notifications.&lt;br /&gt;
* jstl.jar, standard.jar.  Web utilities. Only required in web administration.&lt;br /&gt;
* gson-2.2.2.jar. Supports REST API and web administration.&lt;br /&gt;
* groovy-all-2.1.8.jar.  Support for Groovy script execution (https://groovy-lang.org/).  Only required for GroovyJob usage.&lt;br /&gt;
* jython-standalone-2.5.3.jar.  Support for Python script execution (https://www.jython.org/).  Only required for PythonJob usage.&lt;br /&gt;
* jmustache-1.8.jar. Provides email templating.&lt;br /&gt;
* h2-1.3.154. H2 database and JDBC driver.  Only required for running H2.&lt;br /&gt;
* mariadb-java-client-1.1.5.jar. MySQL JDBC driver. Only required for running against MySQL or MariaDB.&lt;br /&gt;
* jtds-1.2.8.jar. SQL Server JDBC driver.  Only required for running SQLServer.&lt;br /&gt;
* ojdbc6-11.2.0.3.jar. Oracle JDBC driver.  Only required for running Oracle.&lt;br /&gt;
* postgresql-9.0-801.jdbc4.jar.  PostgreSQL JDBC driver.  Only required for running PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 2.9.1&#039;&#039;&#039;, the following redundant library was in included in the Obsidian packaging.&lt;br /&gt;
* smtp.jar.  Used for email notifications.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 2.2.0&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* groovy-all-1.7.6.jar&lt;br /&gt;
* jython.jar (version 2.5.2rc2)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 2.1.1&#039;&#039;&#039;, the following libraries were also included.&lt;br /&gt;
* carfey-date-1.2.jar or carfey-date-1.1.jar.  Date math/manipulation.&lt;br /&gt;
* jdk-gen.jar, jdk.jar, suite-gen.jar, suite.jar.  Core Obsidian libs.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 2.1.0&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* ojdbc14.jar Oracle JDBC driver.  Only required for running Oracle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 1.5&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* gson-1.5.jar. Supports REST API and web administration.&lt;br /&gt;
&lt;br /&gt;
=== Required Libraries for Embedded API ===&lt;br /&gt;
&lt;br /&gt;
To use the [[Embedded_API|Embedded API]], the following resources should be imported. If you have newer versions of the same JARs in your application, feel free to use the newer version. The JAR files below can generally be found in the &#039;&#039;standalone&#039;&#039; directory if your installation. The &amp;lt;code&amp;gt;com.carfey.properties&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;com.carfey.yaml&amp;lt;/code&amp;gt; file can be extracted from the &amp;lt;code&amp;gt;obsidian-properties-configuration.jar&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;obsidian-yaml-configuration.jar&amp;lt;/code&amp;gt; in the &#039;&#039;standalone&#039;&#039; directory, or from an Obsidian WAR file under &amp;lt;code&amp;gt;WEB-INF/classes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* com.carfey.properties/com.carfey.yaml (configuration file), or obsidian-properties-configuration.jar/obsidian-yaml-configuration.jar, which contains the configuration file&lt;br /&gt;
* obsidian.jar&lt;br /&gt;
* dom4j-2.1.3.jar&lt;br /&gt;
* flexmark-0.62.2.jar, flexmark-util-0.62.2.jar&lt;br /&gt;
* gson-2.10.1&lt;br /&gt;
* log4j-api-2.17.0.jar, log4j-core-2.17.0.jar&lt;br /&gt;
* Appropriate JDBC JAR (e.g. mariadb-java-client-2.7.2.jar for MySQL or MariaDB)&lt;br /&gt;
&lt;br /&gt;
In addition, the following resources should be included if you wish to have notification support enabled when using the API:&lt;br /&gt;
* jmustache-1.15.jar&lt;br /&gt;
** jakarta.activation-api-2.1.2.jar, jakarta.mail-api-2.1.2.jar. Used for Jakarta EE email notifications.&lt;br /&gt;
** angus-activation-2.0.1.jar, angus-mail-2.0.2.jar. Optionally used with Jakarta EE email notifications.&lt;br /&gt;
** activation-1.1.jar, javax.mail-1.6.2.jar. Used for javamail (javax) email notifications.&lt;br /&gt;
&lt;br /&gt;
Finally, if you need to configure scripting jobs from the API, you will need to include any applicable JARs from the following list:&lt;br /&gt;
* apache-groovy-all-4.0.24.jar&lt;br /&gt;
* bsh-2.0b5.jar&lt;br /&gt;
* jruby-9.2.17.0.jar&lt;br /&gt;
* jython-standalone-2.7.2.jar&lt;br /&gt;
&lt;br /&gt;
== Disabling Job Execution &amp;amp; Scheduling in the Web Application ==&lt;br /&gt;
See the instructions within the [[Getting_Started#Disabling_Job_Scheduling_in_the_Web_Application|Getting Started Guide]].&lt;br /&gt;
&lt;br /&gt;
== Disabling Automatic Database Updates ==&lt;br /&gt;
See the instructions within the [[Getting_Started#Disabling_Automatic_Database_Updates|Getting Started Guide]].&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Advanced_Configuration&amp;diff=4065</id>
		<title>Advanced Configuration</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Advanced_Configuration&amp;diff=4065"/>
		<updated>2026-06-06T23:45:28Z</updated>

		<summary type="html">&lt;p&gt;Craig: /* Required Libraries for Embedded API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Obsidian requires some initial configuration parameters for database connection information and desired authentication mechanisms.  The installer takes care of configuring these as provided.  For your reference should you wish to manually create/edit these, note the details below.&lt;br /&gt;
&lt;br /&gt;
== Configuration Details ==&lt;br /&gt;
&lt;br /&gt;
The following sections show the available properties and sample values that can be used in the &amp;lt;code&amp;gt;com.carfey.properties&amp;lt;/code&amp;gt; properties file. While properties format is shown, all the same configuration items apply to yaml support. See [[#Properties.2FYaml_File|Properties/Yaml File]] for more details on this file.&lt;br /&gt;
&lt;br /&gt;
=== Authentication Properties ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Comment out the native authenticator setup&lt;br /&gt;
#com.carfey.suite.security.Authenticator=com.carfey.suite.security.DBAuthenticator&lt;br /&gt;
&lt;br /&gt;
#Set your LDAP info here&lt;br /&gt;
com.carfey.suite.security.Authenticator=com.carfey.suite.security.LdapAuthenticator&lt;br /&gt;
# As of Obsidian 2.1.1, you can specify the attribute type used in building up the distinguished name (dn). If unspecified, defaults to cn&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.dn.attribute=uid&lt;br /&gt;
# As of Obsidian 4.5.0, you can provide a delimited list (delimiter is 3 tildes ~~~) of dn.bases to search.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.dn.base=ou=people,o=MyOrgHere&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.url=ldap://localhost:10389&lt;br /&gt;
# As of Obsidian 2.1.1, you can specify the SECURITY_AUTHENTICATION. Defaults to simple. &lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.securityAuthentication=simple&lt;br /&gt;
# Any necessary additional information such as Provider, Principal and Host will need to be handled in your custom class extending LdapAuthenticator.&lt;br /&gt;
&lt;br /&gt;
# As of Obsidian 3.5.1, you can login via an LDAP attribute that is not part of the dn. A matching entry is found in the LDAP Directory (using anonymous or a fixed lookup account) &lt;br /&gt;
# after which the dn attribute above is retrieved to perform the user&#039;s authentication. The following 5 attributes are only used for this type of lookup and authentication.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.lookupDnAttribute=false&lt;br /&gt;
# As of Obsidian 3.5.1, this is the attribute name that is being searched for in the LDAP directory to build the dn for eventual authentication.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.loginAttribute=sAMAccountName&lt;br /&gt;
# As of Obsidian 3.5.1, this determines if these lookups will be done anonymously (without a session authenticated by user/password)&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.anonymousEnabled=false&lt;br /&gt;
# As of Obsidian 3.5.1, if anonymous lookups are not permitted or desired, provide the dn and password to be used for lookups. Typically, a read-only account with &lt;br /&gt;
# read rights to the LDAP entries and attributes in question is sufficient.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.searchUserFullDn=cn=ObsidianLDAPReadOnly,ou=people,o=MyOrgHere&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.searchPassword=password&lt;br /&gt;
# As of Obsidian 4.5.1, an alternate search base configuration parameter is used for the searchUser&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.searchUserDnBase=ou=people,o=MyOrgHere&lt;br /&gt;
# As of Obsidian 4.7.1, you may specify one or more additional group membership attributes beyond the defaults&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.groupMembershipAttribute=businessGroup~~~departmentName&lt;br /&gt;
&lt;br /&gt;
# Configure who may access the web app, based on LDAP group membership&lt;br /&gt;
# As of Obsidian 4.5.0, you can provide a delimited list (delimiter is 3 tildes ~~~) of groups to search.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.accessDN=cn=SchedulerAccess,ou=groups,o=MyOrgHere&lt;br /&gt;
&lt;br /&gt;
# Configure the Write role used in the admin web app, based on LDAP group membership (by default, users may only read)&lt;br /&gt;
# As of Obsidian 4.5.0, you can provide a delimited list (delimiter is 3 tildes ~~~) of groups to search.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.write.dn=cn=SchedulerWrite,ou=groups,o=MyOrgHere&lt;br /&gt;
# No need to alter this&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.write.roleName=Write&lt;br /&gt;
&lt;br /&gt;
# Configure the Admin role used in the admin web app, based on LDAP group membership (users may configure system parameters, etc).&lt;br /&gt;
# As of Obsidian 4.5.0, you can provide a delimited list (delimiter is 3 tildes ~~~) of groups to search.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.admin.dn=cn=SchedulerAdmin,ou=groups,o=MyOrgHere&lt;br /&gt;
# No need to alter this&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.admin.roleName=Admin&lt;br /&gt;
&lt;br /&gt;
# Configure the LimitedRead role used in the admin web app, based on LDAP group membership (by default, users may only read)&lt;br /&gt;
# As of Obsidian 4.5.0, you can provide a delimited list (delimiter is 3 tildes ~~~) of groups to search.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.limitedRead.dn=cn=SchedulerLimitedRead,ou=groups,o=MyOrgHere&lt;br /&gt;
# No need to alter this&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.limitedRead.roleName=LimitedRead&lt;br /&gt;
&lt;br /&gt;
# Configure the APIrole used by the REST API, based on LDAP group membership&lt;br /&gt;
# As of Obsidian 4.5.0, you can provide a delimited list (delimiter is 3 tildes ~~~) of groups to search.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.api.dn=cn=SchedulerAPI,ou=groups,o=MyOrgHere&lt;br /&gt;
# No need to alter this&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.api.roleName=API&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SMTP Mail Properties ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Email configuration for notifications, if desired&lt;br /&gt;
#for straight up open relay, just specify the host using&lt;br /&gt;
mail.smtp.host=smtp.myopenrelayhost.com&lt;br /&gt;
mail.smtp.port=port &lt;br /&gt;
#(standard ports are 25, 465 for SSL, 587 for TLS)&lt;br /&gt;
&lt;br /&gt;
#for using TLS and SSL, provide these as necessary&lt;br /&gt;
mail.smtp.socketFactory.port=port&lt;br /&gt;
mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory&lt;br /&gt;
mail.smtp.auth=true&lt;br /&gt;
mail.smtp.user=myauthenticatedemailuser@email.com&lt;br /&gt;
mail.smtp.password=PASSWORD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# As of Obsidian 2.5.0, we support JNDI lookups for email sessions. All other email properties can be excluded.&lt;br /&gt;
mail.session.jndi.path=java:comp/env/mail/session&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Database Properties ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Database configuration&lt;br /&gt;
com.carfey.obsidian.db.url=jdbc:mysql://localhost/obsidian&lt;br /&gt;
com.carfey.obsidian.db.userId=user&lt;br /&gt;
com.carfey.obsidian.db.password=pass&lt;br /&gt;
&lt;br /&gt;
# Sample JDBC URL formats for all platforms&lt;br /&gt;
#com.carfey.obsidian.db.url=jdbc:mysql://localhost:3306/obsidian&lt;br /&gt;
#com.carfey.obsidian.db.url=jdbc:h2:C:/dev/workspace/obsidian;MVCC=TRUE&lt;br /&gt;
#com.carfey.obsidian.db.url=jdbc:oracle:thin:@localhost:1521:obsidian&lt;br /&gt;
#com.carfey.obsidian.db.url=jdbc:postgresql://localhost:5432/obsidian&lt;br /&gt;
#com.carfey.obsidian.db.url=jdbc:sqlserver://localhost:1433;databaseName=obsidian&lt;br /&gt;
&lt;br /&gt;
# As of Obsidian 6.3.0, we support constructing simple JDBC urls from component properties&lt;br /&gt;
# Only supports basic URL formats noted above and does not support H2&lt;br /&gt;
#com.carfey.obsidian.db.host=localhost&lt;br /&gt;
#com.carfey.obsidian.db.port=3306&lt;br /&gt;
#com.carfey.obsidian.db.databaseName=obsidianDB&lt;br /&gt;
#com.carfey.obsidian.db.dbType=mariadb/mysql/oracle/postgresql/sqlserver&lt;br /&gt;
#com.carfey.obsidian.db.oracleSid=SIDORCL&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
# As of Obsidian 2.5.0, we support JNDI lookups for database connectivity.&lt;br /&gt;
com.carfey.obsidian.db.url=java:comp/env/jdbc/obsidian&lt;br /&gt;
com.carfey.obsidian.db.jndiType=mysql&lt;br /&gt;
#com.carfey.obsidian.db.jndiType=mysql is also used for MariaDB&lt;br /&gt;
#com.carfey.obsidian.db.jndiType=oracle&lt;br /&gt;
#com.carfey.obsidian.db.jndiType=postgresql&lt;br /&gt;
#com.carfey.obsidian.db.jndiType=h2&lt;br /&gt;
#com.carfey.obsidian.db.jndiType=sqlserver&lt;br /&gt;
&lt;br /&gt;
# Table prefix may be used to add a prefix to tables and related database objects. It must be 6 or fewer characters and can contain letters or underscores. Available as of version 2.0.&lt;br /&gt;
com.carfey.obsidian.db.tablePrefix=OBSDN_&lt;br /&gt;
&lt;br /&gt;
# For Oracle databases, when Obsidian&#039;s tables exist in a different schema from the user specified above, or if the user does not default to the schema matching its name, specify the target schema here. Available as of version 2.1.&lt;br /&gt;
# For details on the required privileges to run with an alternate user, see https://wiki.obsidianscheduler.com/docs/Obsidian_Tables#Oracle_Privileges&lt;br /&gt;
# This same configuration item can be used to configure the Postgresql schema. If unspecified, the default is public. Available as of Obsidian 2.1.1. &lt;br /&gt;
# If using JNDI and Oracle/Postgresql, we recommend you set this value to ensure best performance.&lt;br /&gt;
com.carfey.obsidian.db.schema=obsidian&lt;br /&gt;
&lt;br /&gt;
#default max connections per pool if not specified is 50&lt;br /&gt;
com.carfey.obsidian.db.maxConnections=40&lt;br /&gt;
&lt;br /&gt;
#default millis timeout to retrieve available connection from pool if not specified is 2000&lt;br /&gt;
com.carfey.obsidian.db.connectionTimeout=2000&lt;br /&gt;
&lt;br /&gt;
# As of 3.4.0, you can disable pooling of connections, which is suggested only if using another connection pool through JNDI. When true, maxConnections is ignored. &lt;br /&gt;
# When a JNDI data source is selected in the installer, this is set to true by default.&lt;br /&gt;
com.carfey.obsidian.db.disablePooling=true&lt;br /&gt;
&lt;br /&gt;
# As of 4.3.0, Oracle database supports configured wait time.&lt;br /&gt;
com.carfey.obsidian.db.timedLockWaitEnabled=true (default)&lt;br /&gt;
com.carfey.obsidian.db.timedLockWaitSeconds=1 (default, prior to 4.3.0, indefinite wait)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Logging Properties ===&lt;br /&gt;
As of &#039;&#039;&#039;Obsidian 5.0.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Please see [https://logging.apache.org/log4j/2.x/manual/configuration.html Log4j2 configuration]&lt;br /&gt;
&lt;br /&gt;
Before &#039;&#039;&#039;Obsidian 5.0.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Please see [https://logging.apache.org/log4j/1.2/manual.html Log4j Configuration]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Miscellaneous Properties ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# If you wish to change the tokens used to reference global parameters in your job configuration, use the following two values:&lt;br /&gt;
global.param.start.token={{&lt;br /&gt;
global.param.end.token=}}&lt;br /&gt;
&lt;br /&gt;
# Populated by the installer, these values can be used to initialize licence key information into the database.&lt;br /&gt;
com.carfey.obsidian.licence.key=licenceKey&lt;br /&gt;
# Name is only required for hardware-linked or site licenses. Use the name exactly as provided by Carfey Software Corporation in your license email.&lt;br /&gt;
com.carfey.obsidian.licence.name=licenceeName&lt;br /&gt;
&lt;br /&gt;
# As of 2.8.0, if you have issues with classloading (e.g. in Grails or Spring), this flag enables usage of the context classloader .&lt;br /&gt;
com.carfey.jdk.useContextClassLoader=true&lt;br /&gt;
&lt;br /&gt;
# As of 2.9.0, you can set the scheduler host designator name multiple times in the same JVM by using this parameter:&lt;br /&gt;
com.carfey.obsidian.schedulerDesignation=obsidian-dev&lt;br /&gt;
&lt;br /&gt;
# As of 3.0.0, Job Forking can be enabled and configured per node&lt;br /&gt;
com.carfey.obsidian.jvmJobForkingEnabledOnThisNode=true&lt;br /&gt;
# This property is the location of the fork scripts. Obsidian is bundled with obsidianForkedJob.bat and obsidianForkedJob.sh. These are the expected script names.&lt;br /&gt;
com.carfey.obsidian.forkedJobScriptLocation=/Obsidian-3.0.0&lt;br /&gt;
# Use the following optional property if you need to override the default classpath that is built using the contents of the standalone directory.&lt;br /&gt;
# This allows for job forking support in embedded and even webapp deployments. Use the classpath format supported by your operating system.&lt;br /&gt;
#com.carfey.obsidian.forkedJobscriptClasspathOverride=&lt;br /&gt;
# Use the following optional property if you wish to include database configuration parameters as arguments passed to the forking scripts and the target forked Obsidian class.&lt;br /&gt;
# For example, you may need to do this if your configuration is done via System Property overrides or programmmatically in your embedded Obsidian instance.&lt;br /&gt;
#com.carfey.obsidian.jvmJobForkingIncludeDbSysParms=true&lt;br /&gt;
&lt;br /&gt;
# Obsolete as of 4.0.0. As of 3.4.0, the base URL used to resolve links in the Obsidian web app can be overridden. This is typically only required when a load balancer or proxy is used to access Obsidian.&lt;br /&gt;
com.carfey.obsidian.baseHrefUrl=http://myhost:8080/obsidian&lt;br /&gt;
&lt;br /&gt;
# As of 4.3.0, description/parameter formatting is supported. Custom formatter (com.carfey.ops.job.config.formatter.Formatter) supported via this parameter.&lt;br /&gt;
com.carfey.obsidian.formatterClass=com.carfey.ops.job.config.formatter.MarkdownFormatter (default)&lt;br /&gt;
&lt;br /&gt;
# As of 4.4.0, support for running DDL outside Obsidian and applying only the data portion of upgrades. May require incremental upgrades. Contact support for assistance. Enabled with the following:&lt;br /&gt;
com.carfey.obsidian.runner.skipDDL=true&lt;br /&gt;
&lt;br /&gt;
# As of 4.5.0, Slack notifications can be automatically configured for FATAL, ERROR and WARN events by setting this property with a Slack incoming web hook URL. The user name property is optional and defaults to Obsidian Scheduler&lt;br /&gt;
com.carfey.obsidian.slack.webhookUrl=https://hooks.slack.com/services/XXXXXXX/YYYYYYYY/ZZZZZZZZZZ&lt;br /&gt;
com.carfey.obsidian.slack.userName=Obsidian Scheduler (prod)&lt;br /&gt;
&lt;br /&gt;
# As of 4.6.0, Obsidian supports starting a node in paused state. This can also be set as a System property.&lt;br /&gt;
com.carfey.obsidian.schedulerPausedOnStartup=true&lt;br /&gt;
&lt;br /&gt;
# As of 4.10.0, Obsidian supports disabling script engine jobs selectively.&lt;br /&gt;
com.carfey.ops.job.script.BeanShellJob.enabled=true&lt;br /&gt;
com.carfey.ops.job.script.GroovyJob.enabled=true&lt;br /&gt;
com.carfey.ops.job.script.RubyJob.enabled=true&lt;br /&gt;
com.carfey.ops.job.script.PythonJob.enabled=true&lt;br /&gt;
com.carfey.ops.job.script.JavaScriptJob.enabled=true&lt;br /&gt;
&lt;br /&gt;
# As of 5.0.0, Signal interrupt (supported as of 4.5.1) is disabled by default. Use configuration to enable.&lt;br /&gt;
com.carfey.obsidian.signalHandlerActiveForScheduler=true&lt;br /&gt;
&lt;br /&gt;
# As of 5.2.0, you can send Obsidian events to a REST endpoint via an out-of-the-box Event Hook. The basicAuthorization property is optional, the sample showing its use for myusername:mypassword. The &amp;quot;Basic &amp;quot; prefix is added by Obsidian.&lt;br /&gt;
com.carfey.obsidian.restfulEventHook.url=https://myendpoint.com:1234/rest/obsidian_events&lt;br /&gt;
com.carfey.obsidian.restfulEventHook.basicAuthorization=bXl1c2VybmFtZTpteXBhc3N3b3Jk&lt;br /&gt;
&lt;br /&gt;
# As of 5.2.1, maintenance jobs are automatically scheduled for new installations. Set the following property to disable this behaviour.&lt;br /&gt;
com.carfey.obsidian.skipMaintenanceJobInitialization=true&lt;br /&gt;
&lt;br /&gt;
# As of 5.2.1, you can send Obsidian events to standard output and error streams using an out-of-the-box Event Hook. You can enable the default behaviour and auto-register it by adding the following configuration.&lt;br /&gt;
com.carfey.obsidian.standardOutputStreamsEventHook.enabled=true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Table Prefixes ===&lt;br /&gt;
As shown in full configuration reference, a table name prefix may be specified to create Obsidian tables with names beginning with a specified string.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Table prefix may be used to add a prefix to tables and related database objects. It must be 6 or fewer characters and can contain letters or underscores. Available as of version 2.0.&lt;br /&gt;
com.carfey.obsidian.db.tablePrefix=OBSDN_&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Properties/Yaml File ==&lt;br /&gt;
&lt;br /&gt;
The above configuration must reside in a properties file named &amp;lt;code&amp;gt;com.carfey.properties&amp;lt;/code&amp;gt; or a yaml file named &amp;lt;code&amp;gt;com.carfey.yaml&amp;lt;/code&amp;gt; found according to the rules of [http://docs.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html#getResource(java.lang.String) ClassLoader.getResource].  If both yaml and properties files are found, yaml is loaded first and properties values will override. Some possibilities include &amp;lt;code&amp;gt;WEB-INF/classes/com.carfey.(properties/yaml)&amp;lt;/code&amp;gt;, a &amp;lt;code&amp;gt;com.carfey.(properties/yaml)&amp;lt;/code&amp;gt; file in a directory which is explicitly added to the classpath, or at the root of a jar file as is done in &amp;lt;code&amp;gt;obsidian-props.jar&amp;lt;/code&amp;gt; for standalone deployments. Prior to Obsidian 3.6, this file had to exist on the classpath, even if only using the override options below to configure Obsidian.&lt;br /&gt;
&lt;br /&gt;
Instead of using a classpath resource for properties, you can specify an external properties file using the Java system property &amp;lt;code&amp;gt;carfey.properties.file&amp;lt;/code&amp;gt;. All expected properties must be specified in either the default &amp;lt;code&amp;gt;com.carfey.properties&amp;lt;/code&amp;gt; file on the classpath or in the override file. Any properties found in both files will use the override file&#039;s values. Usage: &amp;lt;code&amp;gt;-Dcarfey.properties.file=/home/obsidian/obsidian.properties&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Instead of using a classpath resource for yaml, you can specify an external yaml file using the Java system property &amp;lt;code&amp;gt;carfey.yaml.file&amp;lt;/code&amp;gt;. All expected configuration values must be specified in either the default &amp;lt;code&amp;gt;com.carfey.yaml&amp;lt;/code&amp;gt; file on the classpath or in the override file. Any configuration values found in both files will use the override file&#039;s values. Usage: &amp;lt;code&amp;gt;-Dcarfey.yaml.file=/home/obsidian/obsidian.yaml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
As of Obsidian 2.1, you may also use a programmatic properties override. Simply call &amp;lt;code&amp;gt;com.carfey.jdk.sys.Configurator.setOverride(Properties props)&amp;lt;/code&amp;gt; as early as possible in the application startup.  To quote the javadoc of this method, &#039;&#039;For use as a programmatic properties override. This must be called before any classes are accessed either through invocation or class initialization that may require access to configuration done through properties. Best if done as early as possible in code, perhaps first in an entry point class that does little else and then hands-off to existing entry point.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
As of Obsidian 4.4, you may specify configuration values as System Properties or Environment Variables. Duplicated values are resolved as follows:&lt;br /&gt;
# System Property&lt;br /&gt;
# Environment Variable - &#039;&#039;&#039;&#039;&#039;overridden by System Property&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
# Properties - &#039;&#039;&#039;&#039;&#039;overridden by Environment Variable and System Property&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Notifications Configuration ==&lt;br /&gt;
&lt;br /&gt;
Sending notifications requires SMTP configuration to be defined in the Obsidian properties file. The properties file reference at the beginning of this page includes SMTP configuration details.&lt;br /&gt;
&lt;br /&gt;
In addition to the properties file, you can configure some Notifications settings to tweak how your emails are sent. These values are configurable under the &#039;&#039;Dispatch&#039;&#039; category of the [[Admin Scheduler Settings|scheduler settings]] screen. Defaults are provided, but you can update them appropriately for your needs.  &lt;br /&gt;
&lt;br /&gt;
[[File:NotifSettings_4.0.png]]&lt;br /&gt;
&lt;br /&gt;
== Dependent Libraries ==&lt;br /&gt;
&lt;br /&gt;
Obsidian Scheduler requires a number of third party libraries, both for the web administration application and the scheduler itself.  Below is information on these libraries and how they are used.  Unless otherwise noted, they are mandatory.&lt;br /&gt;
&lt;br /&gt;
As of Obsidian 2.5.0, our installer supports selective [[Installation_Guide#Configuring_3rd_Party_Library_Conflict_Management|conflict management]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Common&#039;&#039;&lt;br /&gt;
* obsidian.jar.  Core Obsidian lib.&lt;br /&gt;
* gson-2.10.1. Supports REST API and web administration.&lt;br /&gt;
* jmustache-1.15.jar. Provides email templating.&lt;br /&gt;
* log4j-api-2.17.0.jar, log4j-core-2.17.0.jar.  Obsidian logging uses log4j2.&lt;br /&gt;
* snakeyaml-2.3.jar. Support for YAML configuration.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Databases&#039;&#039;&lt;br /&gt;
* h2-1.4.200.jar.  H2 database and JDBC driver.  Only required for running H2.&lt;br /&gt;
* mariadb-java-client-2.7.2.jar. MySQL JDBC driver. Only required for running against MySQL or MariaDB.&lt;br /&gt;
* mssql-jdbc-9.2.1.jre11.jar. SQL Server JDBC driver.  Only required for running SQLServer.&lt;br /&gt;
* ojdbc11-21.1.0.0.jar. Oracle JDBC driver.  Only required for running Oracle.&lt;br /&gt;
* postgresql-42.2.19.jar.  PostgreSQL JDBC driver.  Only required for running PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Mail&#039;&#039; &lt;br /&gt;
* activation-1.1.jar, javax.mail-1.6.2.jar. Used for javamail (javax) email notifications.&lt;br /&gt;
* angus-activation-2.0.1.jar, angus-mail-2.0.2.jar. Optionally used with Jakarta EE email notifications.&lt;br /&gt;
* jakarta.activation-api-2.1.2.jar, jakarta.mail-api-2.1.2.jar. Used for Jakarta EE email notifications.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Scripts&#039;&#039;&lt;br /&gt;
* apache-groovy-all-4.0.24.jar. Support for Groovy script execution (https://groovy-lang.org/).  Only required for GroovyJob usage.&lt;br /&gt;
* bsh-2.0b5.jar.  Support for our Bean Shell script execution. (http://www.beanshell.org).  Only required for BeanShellJob usage.&lt;br /&gt;
* jruby-9.2.17.0.jar. Support for Ruby script execution (https://www.jruby.org/). Only required for RubyJob usage.&lt;br /&gt;
* jython-standalone-2.7.2.jar. Support for Python script execution (https://www.jython.org/).  Only required for PythonJob usage.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Web Admin&#039;&#039;&lt;br /&gt;
* dom4j-2.1.3.jar.  XML utilities.&lt;br /&gt;
* flexmark-0.62.2.jar, flexmark-util-0.62.2.jar. Markdown formatting for Description and Parameter job annotations.&lt;br /&gt;
* jxl-2.6.12.jar. Excel file format utilities. Only required in web administration.&lt;br /&gt;
* opencsv-5.4.jar. Support for CSV downloads in UI.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 6.0.0&#039;&#039;&#039;, the following library was in use.&lt;br /&gt;
* groovy-all-3.0.7.jar. Support for Groovy script execution (https://groovy-lang.org/).  Only required for GroovyJob usage.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 5.4.0&#039;&#039;&#039;, the following library was in use.&lt;br /&gt;
* gson-2.8.6.jar. Supports REST API and web administration.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 5.2.0&#039;&#039;&#039;, the following library was in use.&lt;br /&gt;
* jakarta.activation-1.2.1.jar. Used for email notifications.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 5.0.3&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* &#039;&#039;Obsidian 5.0.2&#039;&#039; log4j-api-2.16.0.jar, log4j-core-2.16.0.jar.  &lt;br /&gt;
* &#039;&#039;Obsidian 5.0.1&#039;&#039; log4j-api-2.15.0.jar, log4j-core-2.15.0.jar.  &lt;br /&gt;
* &#039;&#039;Obsidian 5.0.0&#039;&#039; log4j-api-2.14.1.jar, log4j-core-2.14.1.jar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 5.0.0&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* activation-1.1.jar, javax.mail-1.5.5.jar.  Used for email notifications.&lt;br /&gt;
* dom4j-1.6.1.jar. XML utilities.&lt;br /&gt;
* gson-2.7.jar. Supports REST API and web administration.&lt;br /&gt;
* bsh-2.0b4.jar.  Support for our Bean Shell script execution. (http://www.beanshell.org).  Only required for BeanShellJob usage.&lt;br /&gt;
* groovy-all-2.4.14.jar. Support for Groovy script execution (https://groovy-lang.org/).  Only required for GroovyJob usage.&lt;br /&gt;
* jython-standalone-2.7.0.jar. Support for Python script execution (https://www.jython.org/).  Only required for PythonJob usage.&lt;br /&gt;
* jruby-complete-9.2.7.0.jar. Support for Ruby script execution (https://www.jruby.org/). Only required for RubyJob usage.&lt;br /&gt;
* jmustache-1.12.jar. Provides email templating.&lt;br /&gt;
* h2-1.4.192.  H2 database and JDBC driver.  Only required for running H2.&lt;br /&gt;
* log4j-1.2.9.jar.  Obsidian logging uses log4j.&lt;br /&gt;
* mariadb-java-client-1.4.5.jar.  MySQL JDBC driver. Only required for running against MySQL or MariaDB.&lt;br /&gt;
* jtds-1.3.1.jar. SQL Server JDBC driver.  Only required for running SQLServer.&lt;br /&gt;
* ojdbc7-12.1.0.1.jar.  Oracle JDBC driver.  Only required for running Oracle.&lt;br /&gt;
* postgresql-9.4.1208.jre7.jar. PostgreSQL JDBC driver.  Only required for running PostgreSQL.&lt;br /&gt;
* opencsv-3.8.jar. Support for CSV downloads in UI.&lt;br /&gt;
* flexmark-0.19.6.jar, flexmark-util-0.19.6.jar (as of 4.3.0). Markdown formatting for Description and Parameter job annotations.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 4.5.1&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* groovy-all-2.4.7.jar. Support for Groovy script execution (https://groovy-lang.org/).  Only required for GroovyJob usage.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 4.0.0&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* javax.mail-1.5.2.jar.  Used for email notifications.&lt;br /&gt;
* jstl.jar, standard.jar.  Web utilities. Only required in web administration.&lt;br /&gt;
* gson-2.2.2.jar. Supports REST API and web administration.&lt;br /&gt;
* groovy-all-2.1.8.jar.  Support for Groovy script execution (https://groovy-lang.org/).  Only required for GroovyJob usage.&lt;br /&gt;
* jython-standalone-2.5.3.jar.  Support for Python script execution (https://www.jython.org/).  Only required for PythonJob usage.&lt;br /&gt;
* jmustache-1.8.jar. Provides email templating.&lt;br /&gt;
* h2-1.3.154. H2 database and JDBC driver.  Only required for running H2.&lt;br /&gt;
* mariadb-java-client-1.1.5.jar. MySQL JDBC driver. Only required for running against MySQL or MariaDB.&lt;br /&gt;
* jtds-1.2.8.jar. SQL Server JDBC driver.  Only required for running SQLServer.&lt;br /&gt;
* ojdbc6-11.2.0.3.jar. Oracle JDBC driver.  Only required for running Oracle.&lt;br /&gt;
* postgresql-9.0-801.jdbc4.jar.  PostgreSQL JDBC driver.  Only required for running PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 2.9.1&#039;&#039;&#039;, the following redundant library was in included in the Obsidian packaging.&lt;br /&gt;
* smtp.jar.  Used for email notifications.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 2.2.0&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* groovy-all-1.7.6.jar&lt;br /&gt;
* jython.jar (version 2.5.2rc2)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 2.1.1&#039;&#039;&#039;, the following libraries were also included.&lt;br /&gt;
* carfey-date-1.2.jar or carfey-date-1.1.jar.  Date math/manipulation.&lt;br /&gt;
* jdk-gen.jar, jdk.jar, suite-gen.jar, suite.jar.  Core Obsidian libs.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 2.1.0&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* ojdbc14.jar Oracle JDBC driver.  Only required for running Oracle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 1.5&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* gson-1.5.jar. Supports REST API and web administration.&lt;br /&gt;
&lt;br /&gt;
=== Required Libraries for Embedded API ===&lt;br /&gt;
&lt;br /&gt;
To use the [[Embedded_API|Embedded API]], the following resources should be imported. If you have newer versions of the same JARs in your application, feel free to use the newer version. The JAR files below can generally be found in the &#039;&#039;standalone&#039;&#039; directory if your installation. The &amp;lt;code&amp;gt;com.carfey.properties&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;com.carfey.yaml&amp;lt;/code&amp;gt; file can be extracted from the &amp;lt;code&amp;gt;obsidian-properties-configuration.jar&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;obsidian-yaml-configuration.jar&amp;lt;/code&amp;gt; in the &#039;&#039;standalone&#039;&#039; directory, or from an Obsidian WAR file under &amp;lt;code&amp;gt;WEB-INF/classes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* com.carfey.properties/com.carfey.yaml (configuration file), or obsidian-props.jar, which contains the configuration file&lt;br /&gt;
* obsidian.jar&lt;br /&gt;
* dom4j-2.1.3.jar&lt;br /&gt;
* flexmark-0.62.2.jar, flexmark-util-0.62.2.jar&lt;br /&gt;
* gson-2.10.1&lt;br /&gt;
* log4j-api-2.17.0.jar, log4j-core-2.17.0.jar&lt;br /&gt;
* Appropriate JDBC JAR (e.g. mariadb-java-client-2.7.2.jar for MySQL or MariaDB)&lt;br /&gt;
&lt;br /&gt;
In addition, the following resources should be included if you wish to have notification support enabled when using the API:&lt;br /&gt;
* jmustache-1.15.jar&lt;br /&gt;
** jakarta.activation-api-2.1.2.jar, jakarta.mail-api-2.1.2.jar. Used for Jakarta EE email notifications.&lt;br /&gt;
** angus-activation-2.0.1.jar, angus-mail-2.0.2.jar. Optionally used with Jakarta EE email notifications.&lt;br /&gt;
** activation-1.1.jar, javax.mail-1.6.2.jar. Used for javamail (javax) email notifications.&lt;br /&gt;
&lt;br /&gt;
Finally, if you need to configure scripting jobs from the API, you will need to include any applicable JARs from the following list:&lt;br /&gt;
* apache-groovy-all-4.0.24.jar&lt;br /&gt;
* bsh-2.0b5.jar&lt;br /&gt;
* jruby-9.2.17.0.jar&lt;br /&gt;
* jython-standalone-2.7.2.jar&lt;br /&gt;
&lt;br /&gt;
== Disabling Job Execution &amp;amp; Scheduling in the Web Application ==&lt;br /&gt;
See the instructions within the [[Getting_Started#Disabling_Job_Scheduling_in_the_Web_Application|Getting Started Guide]].&lt;br /&gt;
&lt;br /&gt;
== Disabling Automatic Database Updates ==&lt;br /&gt;
See the instructions within the [[Getting_Started#Disabling_Automatic_Database_Updates|Getting Started Guide]].&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Advanced_Configuration&amp;diff=4064</id>
		<title>Advanced Configuration</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Advanced_Configuration&amp;diff=4064"/>
		<updated>2026-06-06T23:44:46Z</updated>

		<summary type="html">&lt;p&gt;Craig: /* Required Libraries for Embedded API */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Obsidian requires some initial configuration parameters for database connection information and desired authentication mechanisms.  The installer takes care of configuring these as provided.  For your reference should you wish to manually create/edit these, note the details below.&lt;br /&gt;
&lt;br /&gt;
== Configuration Details ==&lt;br /&gt;
&lt;br /&gt;
The following sections show the available properties and sample values that can be used in the &amp;lt;code&amp;gt;com.carfey.properties&amp;lt;/code&amp;gt; properties file. While properties format is shown, all the same configuration items apply to yaml support. See [[#Properties.2FYaml_File|Properties/Yaml File]] for more details on this file.&lt;br /&gt;
&lt;br /&gt;
=== Authentication Properties ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Comment out the native authenticator setup&lt;br /&gt;
#com.carfey.suite.security.Authenticator=com.carfey.suite.security.DBAuthenticator&lt;br /&gt;
&lt;br /&gt;
#Set your LDAP info here&lt;br /&gt;
com.carfey.suite.security.Authenticator=com.carfey.suite.security.LdapAuthenticator&lt;br /&gt;
# As of Obsidian 2.1.1, you can specify the attribute type used in building up the distinguished name (dn). If unspecified, defaults to cn&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.dn.attribute=uid&lt;br /&gt;
# As of Obsidian 4.5.0, you can provide a delimited list (delimiter is 3 tildes ~~~) of dn.bases to search.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.dn.base=ou=people,o=MyOrgHere&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.url=ldap://localhost:10389&lt;br /&gt;
# As of Obsidian 2.1.1, you can specify the SECURITY_AUTHENTICATION. Defaults to simple. &lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.securityAuthentication=simple&lt;br /&gt;
# Any necessary additional information such as Provider, Principal and Host will need to be handled in your custom class extending LdapAuthenticator.&lt;br /&gt;
&lt;br /&gt;
# As of Obsidian 3.5.1, you can login via an LDAP attribute that is not part of the dn. A matching entry is found in the LDAP Directory (using anonymous or a fixed lookup account) &lt;br /&gt;
# after which the dn attribute above is retrieved to perform the user&#039;s authentication. The following 5 attributes are only used for this type of lookup and authentication.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.lookupDnAttribute=false&lt;br /&gt;
# As of Obsidian 3.5.1, this is the attribute name that is being searched for in the LDAP directory to build the dn for eventual authentication.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.loginAttribute=sAMAccountName&lt;br /&gt;
# As of Obsidian 3.5.1, this determines if these lookups will be done anonymously (without a session authenticated by user/password)&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.anonymousEnabled=false&lt;br /&gt;
# As of Obsidian 3.5.1, if anonymous lookups are not permitted or desired, provide the dn and password to be used for lookups. Typically, a read-only account with &lt;br /&gt;
# read rights to the LDAP entries and attributes in question is sufficient.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.searchUserFullDn=cn=ObsidianLDAPReadOnly,ou=people,o=MyOrgHere&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.searchPassword=password&lt;br /&gt;
# As of Obsidian 4.5.1, an alternate search base configuration parameter is used for the searchUser&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.searchUserDnBase=ou=people,o=MyOrgHere&lt;br /&gt;
# As of Obsidian 4.7.1, you may specify one or more additional group membership attributes beyond the defaults&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.groupMembershipAttribute=businessGroup~~~departmentName&lt;br /&gt;
&lt;br /&gt;
# Configure who may access the web app, based on LDAP group membership&lt;br /&gt;
# As of Obsidian 4.5.0, you can provide a delimited list (delimiter is 3 tildes ~~~) of groups to search.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.accessDN=cn=SchedulerAccess,ou=groups,o=MyOrgHere&lt;br /&gt;
&lt;br /&gt;
# Configure the Write role used in the admin web app, based on LDAP group membership (by default, users may only read)&lt;br /&gt;
# As of Obsidian 4.5.0, you can provide a delimited list (delimiter is 3 tildes ~~~) of groups to search.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.write.dn=cn=SchedulerWrite,ou=groups,o=MyOrgHere&lt;br /&gt;
# No need to alter this&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.write.roleName=Write&lt;br /&gt;
&lt;br /&gt;
# Configure the Admin role used in the admin web app, based on LDAP group membership (users may configure system parameters, etc).&lt;br /&gt;
# As of Obsidian 4.5.0, you can provide a delimited list (delimiter is 3 tildes ~~~) of groups to search.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.admin.dn=cn=SchedulerAdmin,ou=groups,o=MyOrgHere&lt;br /&gt;
# No need to alter this&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.admin.roleName=Admin&lt;br /&gt;
&lt;br /&gt;
# Configure the LimitedRead role used in the admin web app, based on LDAP group membership (by default, users may only read)&lt;br /&gt;
# As of Obsidian 4.5.0, you can provide a delimited list (delimiter is 3 tildes ~~~) of groups to search.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.limitedRead.dn=cn=SchedulerLimitedRead,ou=groups,o=MyOrgHere&lt;br /&gt;
# No need to alter this&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.limitedRead.roleName=LimitedRead&lt;br /&gt;
&lt;br /&gt;
# Configure the APIrole used by the REST API, based on LDAP group membership&lt;br /&gt;
# As of Obsidian 4.5.0, you can provide a delimited list (delimiter is 3 tildes ~~~) of groups to search.&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.api.dn=cn=SchedulerAPI,ou=groups,o=MyOrgHere&lt;br /&gt;
# No need to alter this&lt;br /&gt;
com.carfey.suite.security.LdapAuthenticator.role.api.roleName=API&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== SMTP Mail Properties ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Email configuration for notifications, if desired&lt;br /&gt;
#for straight up open relay, just specify the host using&lt;br /&gt;
mail.smtp.host=smtp.myopenrelayhost.com&lt;br /&gt;
mail.smtp.port=port &lt;br /&gt;
#(standard ports are 25, 465 for SSL, 587 for TLS)&lt;br /&gt;
&lt;br /&gt;
#for using TLS and SSL, provide these as necessary&lt;br /&gt;
mail.smtp.socketFactory.port=port&lt;br /&gt;
mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory&lt;br /&gt;
mail.smtp.auth=true&lt;br /&gt;
mail.smtp.user=myauthenticatedemailuser@email.com&lt;br /&gt;
mail.smtp.password=PASSWORD&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
# As of Obsidian 2.5.0, we support JNDI lookups for email sessions. All other email properties can be excluded.&lt;br /&gt;
mail.session.jndi.path=java:comp/env/mail/session&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Database Properties ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Database configuration&lt;br /&gt;
com.carfey.obsidian.db.url=jdbc:mysql://localhost/obsidian&lt;br /&gt;
com.carfey.obsidian.db.userId=user&lt;br /&gt;
com.carfey.obsidian.db.password=pass&lt;br /&gt;
&lt;br /&gt;
# Sample JDBC URL formats for all platforms&lt;br /&gt;
#com.carfey.obsidian.db.url=jdbc:mysql://localhost:3306/obsidian&lt;br /&gt;
#com.carfey.obsidian.db.url=jdbc:h2:C:/dev/workspace/obsidian;MVCC=TRUE&lt;br /&gt;
#com.carfey.obsidian.db.url=jdbc:oracle:thin:@localhost:1521:obsidian&lt;br /&gt;
#com.carfey.obsidian.db.url=jdbc:postgresql://localhost:5432/obsidian&lt;br /&gt;
#com.carfey.obsidian.db.url=jdbc:sqlserver://localhost:1433;databaseName=obsidian&lt;br /&gt;
&lt;br /&gt;
# As of Obsidian 6.3.0, we support constructing simple JDBC urls from component properties&lt;br /&gt;
# Only supports basic URL formats noted above and does not support H2&lt;br /&gt;
#com.carfey.obsidian.db.host=localhost&lt;br /&gt;
#com.carfey.obsidian.db.port=3306&lt;br /&gt;
#com.carfey.obsidian.db.databaseName=obsidianDB&lt;br /&gt;
#com.carfey.obsidian.db.dbType=mariadb/mysql/oracle/postgresql/sqlserver&lt;br /&gt;
#com.carfey.obsidian.db.oracleSid=SIDORCL&lt;br /&gt;
	&lt;br /&gt;
&lt;br /&gt;
# As of Obsidian 2.5.0, we support JNDI lookups for database connectivity.&lt;br /&gt;
com.carfey.obsidian.db.url=java:comp/env/jdbc/obsidian&lt;br /&gt;
com.carfey.obsidian.db.jndiType=mysql&lt;br /&gt;
#com.carfey.obsidian.db.jndiType=mysql is also used for MariaDB&lt;br /&gt;
#com.carfey.obsidian.db.jndiType=oracle&lt;br /&gt;
#com.carfey.obsidian.db.jndiType=postgresql&lt;br /&gt;
#com.carfey.obsidian.db.jndiType=h2&lt;br /&gt;
#com.carfey.obsidian.db.jndiType=sqlserver&lt;br /&gt;
&lt;br /&gt;
# Table prefix may be used to add a prefix to tables and related database objects. It must be 6 or fewer characters and can contain letters or underscores. Available as of version 2.0.&lt;br /&gt;
com.carfey.obsidian.db.tablePrefix=OBSDN_&lt;br /&gt;
&lt;br /&gt;
# For Oracle databases, when Obsidian&#039;s tables exist in a different schema from the user specified above, or if the user does not default to the schema matching its name, specify the target schema here. Available as of version 2.1.&lt;br /&gt;
# For details on the required privileges to run with an alternate user, see https://wiki.obsidianscheduler.com/docs/Obsidian_Tables#Oracle_Privileges&lt;br /&gt;
# This same configuration item can be used to configure the Postgresql schema. If unspecified, the default is public. Available as of Obsidian 2.1.1. &lt;br /&gt;
# If using JNDI and Oracle/Postgresql, we recommend you set this value to ensure best performance.&lt;br /&gt;
com.carfey.obsidian.db.schema=obsidian&lt;br /&gt;
&lt;br /&gt;
#default max connections per pool if not specified is 50&lt;br /&gt;
com.carfey.obsidian.db.maxConnections=40&lt;br /&gt;
&lt;br /&gt;
#default millis timeout to retrieve available connection from pool if not specified is 2000&lt;br /&gt;
com.carfey.obsidian.db.connectionTimeout=2000&lt;br /&gt;
&lt;br /&gt;
# As of 3.4.0, you can disable pooling of connections, which is suggested only if using another connection pool through JNDI. When true, maxConnections is ignored. &lt;br /&gt;
# When a JNDI data source is selected in the installer, this is set to true by default.&lt;br /&gt;
com.carfey.obsidian.db.disablePooling=true&lt;br /&gt;
&lt;br /&gt;
# As of 4.3.0, Oracle database supports configured wait time.&lt;br /&gt;
com.carfey.obsidian.db.timedLockWaitEnabled=true (default)&lt;br /&gt;
com.carfey.obsidian.db.timedLockWaitSeconds=1 (default, prior to 4.3.0, indefinite wait)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Logging Properties ===&lt;br /&gt;
As of &#039;&#039;&#039;Obsidian 5.0.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Please see [https://logging.apache.org/log4j/2.x/manual/configuration.html Log4j2 configuration]&lt;br /&gt;
&lt;br /&gt;
Before &#039;&#039;&#039;Obsidian 5.0.0&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Please see [https://logging.apache.org/log4j/1.2/manual.html Log4j Configuration]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Miscellaneous Properties ===&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# If you wish to change the tokens used to reference global parameters in your job configuration, use the following two values:&lt;br /&gt;
global.param.start.token={{&lt;br /&gt;
global.param.end.token=}}&lt;br /&gt;
&lt;br /&gt;
# Populated by the installer, these values can be used to initialize licence key information into the database.&lt;br /&gt;
com.carfey.obsidian.licence.key=licenceKey&lt;br /&gt;
# Name is only required for hardware-linked or site licenses. Use the name exactly as provided by Carfey Software Corporation in your license email.&lt;br /&gt;
com.carfey.obsidian.licence.name=licenceeName&lt;br /&gt;
&lt;br /&gt;
# As of 2.8.0, if you have issues with classloading (e.g. in Grails or Spring), this flag enables usage of the context classloader .&lt;br /&gt;
com.carfey.jdk.useContextClassLoader=true&lt;br /&gt;
&lt;br /&gt;
# As of 2.9.0, you can set the scheduler host designator name multiple times in the same JVM by using this parameter:&lt;br /&gt;
com.carfey.obsidian.schedulerDesignation=obsidian-dev&lt;br /&gt;
&lt;br /&gt;
# As of 3.0.0, Job Forking can be enabled and configured per node&lt;br /&gt;
com.carfey.obsidian.jvmJobForkingEnabledOnThisNode=true&lt;br /&gt;
# This property is the location of the fork scripts. Obsidian is bundled with obsidianForkedJob.bat and obsidianForkedJob.sh. These are the expected script names.&lt;br /&gt;
com.carfey.obsidian.forkedJobScriptLocation=/Obsidian-3.0.0&lt;br /&gt;
# Use the following optional property if you need to override the default classpath that is built using the contents of the standalone directory.&lt;br /&gt;
# This allows for job forking support in embedded and even webapp deployments. Use the classpath format supported by your operating system.&lt;br /&gt;
#com.carfey.obsidian.forkedJobscriptClasspathOverride=&lt;br /&gt;
# Use the following optional property if you wish to include database configuration parameters as arguments passed to the forking scripts and the target forked Obsidian class.&lt;br /&gt;
# For example, you may need to do this if your configuration is done via System Property overrides or programmmatically in your embedded Obsidian instance.&lt;br /&gt;
#com.carfey.obsidian.jvmJobForkingIncludeDbSysParms=true&lt;br /&gt;
&lt;br /&gt;
# Obsolete as of 4.0.0. As of 3.4.0, the base URL used to resolve links in the Obsidian web app can be overridden. This is typically only required when a load balancer or proxy is used to access Obsidian.&lt;br /&gt;
com.carfey.obsidian.baseHrefUrl=http://myhost:8080/obsidian&lt;br /&gt;
&lt;br /&gt;
# As of 4.3.0, description/parameter formatting is supported. Custom formatter (com.carfey.ops.job.config.formatter.Formatter) supported via this parameter.&lt;br /&gt;
com.carfey.obsidian.formatterClass=com.carfey.ops.job.config.formatter.MarkdownFormatter (default)&lt;br /&gt;
&lt;br /&gt;
# As of 4.4.0, support for running DDL outside Obsidian and applying only the data portion of upgrades. May require incremental upgrades. Contact support for assistance. Enabled with the following:&lt;br /&gt;
com.carfey.obsidian.runner.skipDDL=true&lt;br /&gt;
&lt;br /&gt;
# As of 4.5.0, Slack notifications can be automatically configured for FATAL, ERROR and WARN events by setting this property with a Slack incoming web hook URL. The user name property is optional and defaults to Obsidian Scheduler&lt;br /&gt;
com.carfey.obsidian.slack.webhookUrl=https://hooks.slack.com/services/XXXXXXX/YYYYYYYY/ZZZZZZZZZZ&lt;br /&gt;
com.carfey.obsidian.slack.userName=Obsidian Scheduler (prod)&lt;br /&gt;
&lt;br /&gt;
# As of 4.6.0, Obsidian supports starting a node in paused state. This can also be set as a System property.&lt;br /&gt;
com.carfey.obsidian.schedulerPausedOnStartup=true&lt;br /&gt;
&lt;br /&gt;
# As of 4.10.0, Obsidian supports disabling script engine jobs selectively.&lt;br /&gt;
com.carfey.ops.job.script.BeanShellJob.enabled=true&lt;br /&gt;
com.carfey.ops.job.script.GroovyJob.enabled=true&lt;br /&gt;
com.carfey.ops.job.script.RubyJob.enabled=true&lt;br /&gt;
com.carfey.ops.job.script.PythonJob.enabled=true&lt;br /&gt;
com.carfey.ops.job.script.JavaScriptJob.enabled=true&lt;br /&gt;
&lt;br /&gt;
# As of 5.0.0, Signal interrupt (supported as of 4.5.1) is disabled by default. Use configuration to enable.&lt;br /&gt;
com.carfey.obsidian.signalHandlerActiveForScheduler=true&lt;br /&gt;
&lt;br /&gt;
# As of 5.2.0, you can send Obsidian events to a REST endpoint via an out-of-the-box Event Hook. The basicAuthorization property is optional, the sample showing its use for myusername:mypassword. The &amp;quot;Basic &amp;quot; prefix is added by Obsidian.&lt;br /&gt;
com.carfey.obsidian.restfulEventHook.url=https://myendpoint.com:1234/rest/obsidian_events&lt;br /&gt;
com.carfey.obsidian.restfulEventHook.basicAuthorization=bXl1c2VybmFtZTpteXBhc3N3b3Jk&lt;br /&gt;
&lt;br /&gt;
# As of 5.2.1, maintenance jobs are automatically scheduled for new installations. Set the following property to disable this behaviour.&lt;br /&gt;
com.carfey.obsidian.skipMaintenanceJobInitialization=true&lt;br /&gt;
&lt;br /&gt;
# As of 5.2.1, you can send Obsidian events to standard output and error streams using an out-of-the-box Event Hook. You can enable the default behaviour and auto-register it by adding the following configuration.&lt;br /&gt;
com.carfey.obsidian.standardOutputStreamsEventHook.enabled=true&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Table Prefixes ===&lt;br /&gt;
As shown in full configuration reference, a table name prefix may be specified to create Obsidian tables with names beginning with a specified string.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
# Table prefix may be used to add a prefix to tables and related database objects. It must be 6 or fewer characters and can contain letters or underscores. Available as of version 2.0.&lt;br /&gt;
com.carfey.obsidian.db.tablePrefix=OBSDN_&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Properties/Yaml File ==&lt;br /&gt;
&lt;br /&gt;
The above configuration must reside in a properties file named &amp;lt;code&amp;gt;com.carfey.properties&amp;lt;/code&amp;gt; or a yaml file named &amp;lt;code&amp;gt;com.carfey.yaml&amp;lt;/code&amp;gt; found according to the rules of [http://docs.oracle.com/javase/6/docs/api/java/lang/ClassLoader.html#getResource(java.lang.String) ClassLoader.getResource].  If both yaml and properties files are found, yaml is loaded first and properties values will override. Some possibilities include &amp;lt;code&amp;gt;WEB-INF/classes/com.carfey.(properties/yaml)&amp;lt;/code&amp;gt;, a &amp;lt;code&amp;gt;com.carfey.(properties/yaml)&amp;lt;/code&amp;gt; file in a directory which is explicitly added to the classpath, or at the root of a jar file as is done in &amp;lt;code&amp;gt;obsidian-props.jar&amp;lt;/code&amp;gt; for standalone deployments. Prior to Obsidian 3.6, this file had to exist on the classpath, even if only using the override options below to configure Obsidian.&lt;br /&gt;
&lt;br /&gt;
Instead of using a classpath resource for properties, you can specify an external properties file using the Java system property &amp;lt;code&amp;gt;carfey.properties.file&amp;lt;/code&amp;gt;. All expected properties must be specified in either the default &amp;lt;code&amp;gt;com.carfey.properties&amp;lt;/code&amp;gt; file on the classpath or in the override file. Any properties found in both files will use the override file&#039;s values. Usage: &amp;lt;code&amp;gt;-Dcarfey.properties.file=/home/obsidian/obsidian.properties&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Instead of using a classpath resource for yaml, you can specify an external yaml file using the Java system property &amp;lt;code&amp;gt;carfey.yaml.file&amp;lt;/code&amp;gt;. All expected configuration values must be specified in either the default &amp;lt;code&amp;gt;com.carfey.yaml&amp;lt;/code&amp;gt; file on the classpath or in the override file. Any configuration values found in both files will use the override file&#039;s values. Usage: &amp;lt;code&amp;gt;-Dcarfey.yaml.file=/home/obsidian/obsidian.yaml&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
As of Obsidian 2.1, you may also use a programmatic properties override. Simply call &amp;lt;code&amp;gt;com.carfey.jdk.sys.Configurator.setOverride(Properties props)&amp;lt;/code&amp;gt; as early as possible in the application startup.  To quote the javadoc of this method, &#039;&#039;For use as a programmatic properties override. This must be called before any classes are accessed either through invocation or class initialization that may require access to configuration done through properties. Best if done as early as possible in code, perhaps first in an entry point class that does little else and then hands-off to existing entry point.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
As of Obsidian 4.4, you may specify configuration values as System Properties or Environment Variables. Duplicated values are resolved as follows:&lt;br /&gt;
# System Property&lt;br /&gt;
# Environment Variable - &#039;&#039;&#039;&#039;&#039;overridden by System Property&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
# Properties - &#039;&#039;&#039;&#039;&#039;overridden by Environment Variable and System Property&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
== Notifications Configuration ==&lt;br /&gt;
&lt;br /&gt;
Sending notifications requires SMTP configuration to be defined in the Obsidian properties file. The properties file reference at the beginning of this page includes SMTP configuration details.&lt;br /&gt;
&lt;br /&gt;
In addition to the properties file, you can configure some Notifications settings to tweak how your emails are sent. These values are configurable under the &#039;&#039;Dispatch&#039;&#039; category of the [[Admin Scheduler Settings|scheduler settings]] screen. Defaults are provided, but you can update them appropriately for your needs.  &lt;br /&gt;
&lt;br /&gt;
[[File:NotifSettings_4.0.png]]&lt;br /&gt;
&lt;br /&gt;
== Dependent Libraries ==&lt;br /&gt;
&lt;br /&gt;
Obsidian Scheduler requires a number of third party libraries, both for the web administration application and the scheduler itself.  Below is information on these libraries and how they are used.  Unless otherwise noted, they are mandatory.&lt;br /&gt;
&lt;br /&gt;
As of Obsidian 2.5.0, our installer supports selective [[Installation_Guide#Configuring_3rd_Party_Library_Conflict_Management|conflict management]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Common&#039;&#039;&lt;br /&gt;
* obsidian.jar.  Core Obsidian lib.&lt;br /&gt;
* gson-2.10.1. Supports REST API and web administration.&lt;br /&gt;
* jmustache-1.15.jar. Provides email templating.&lt;br /&gt;
* log4j-api-2.17.0.jar, log4j-core-2.17.0.jar.  Obsidian logging uses log4j2.&lt;br /&gt;
* snakeyaml-2.3.jar. Support for YAML configuration.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Databases&#039;&#039;&lt;br /&gt;
* h2-1.4.200.jar.  H2 database and JDBC driver.  Only required for running H2.&lt;br /&gt;
* mariadb-java-client-2.7.2.jar. MySQL JDBC driver. Only required for running against MySQL or MariaDB.&lt;br /&gt;
* mssql-jdbc-9.2.1.jre11.jar. SQL Server JDBC driver.  Only required for running SQLServer.&lt;br /&gt;
* ojdbc11-21.1.0.0.jar. Oracle JDBC driver.  Only required for running Oracle.&lt;br /&gt;
* postgresql-42.2.19.jar.  PostgreSQL JDBC driver.  Only required for running PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Mail&#039;&#039; &lt;br /&gt;
* activation-1.1.jar, javax.mail-1.6.2.jar. Used for javamail (javax) email notifications.&lt;br /&gt;
* angus-activation-2.0.1.jar, angus-mail-2.0.2.jar. Optionally used with Jakarta EE email notifications.&lt;br /&gt;
* jakarta.activation-api-2.1.2.jar, jakarta.mail-api-2.1.2.jar. Used for Jakarta EE email notifications.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Scripts&#039;&#039;&lt;br /&gt;
* apache-groovy-all-4.0.24.jar. Support for Groovy script execution (https://groovy-lang.org/).  Only required for GroovyJob usage.&lt;br /&gt;
* bsh-2.0b5.jar.  Support for our Bean Shell script execution. (http://www.beanshell.org).  Only required for BeanShellJob usage.&lt;br /&gt;
* jruby-9.2.17.0.jar. Support for Ruby script execution (https://www.jruby.org/). Only required for RubyJob usage.&lt;br /&gt;
* jython-standalone-2.7.2.jar. Support for Python script execution (https://www.jython.org/).  Only required for PythonJob usage.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Web Admin&#039;&#039;&lt;br /&gt;
* dom4j-2.1.3.jar.  XML utilities.&lt;br /&gt;
* flexmark-0.62.2.jar, flexmark-util-0.62.2.jar. Markdown formatting for Description and Parameter job annotations.&lt;br /&gt;
* jxl-2.6.12.jar. Excel file format utilities. Only required in web administration.&lt;br /&gt;
* opencsv-5.4.jar. Support for CSV downloads in UI.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 6.0.0&#039;&#039;&#039;, the following library was in use.&lt;br /&gt;
* groovy-all-3.0.7.jar. Support for Groovy script execution (https://groovy-lang.org/).  Only required for GroovyJob usage.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 5.4.0&#039;&#039;&#039;, the following library was in use.&lt;br /&gt;
* gson-2.8.6.jar. Supports REST API and web administration.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 5.2.0&#039;&#039;&#039;, the following library was in use.&lt;br /&gt;
* jakarta.activation-1.2.1.jar. Used for email notifications.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 5.0.3&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* &#039;&#039;Obsidian 5.0.2&#039;&#039; log4j-api-2.16.0.jar, log4j-core-2.16.0.jar.  &lt;br /&gt;
* &#039;&#039;Obsidian 5.0.1&#039;&#039; log4j-api-2.15.0.jar, log4j-core-2.15.0.jar.  &lt;br /&gt;
* &#039;&#039;Obsidian 5.0.0&#039;&#039; log4j-api-2.14.1.jar, log4j-core-2.14.1.jar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 5.0.0&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* activation-1.1.jar, javax.mail-1.5.5.jar.  Used for email notifications.&lt;br /&gt;
* dom4j-1.6.1.jar. XML utilities.&lt;br /&gt;
* gson-2.7.jar. Supports REST API and web administration.&lt;br /&gt;
* bsh-2.0b4.jar.  Support for our Bean Shell script execution. (http://www.beanshell.org).  Only required for BeanShellJob usage.&lt;br /&gt;
* groovy-all-2.4.14.jar. Support for Groovy script execution (https://groovy-lang.org/).  Only required for GroovyJob usage.&lt;br /&gt;
* jython-standalone-2.7.0.jar. Support for Python script execution (https://www.jython.org/).  Only required for PythonJob usage.&lt;br /&gt;
* jruby-complete-9.2.7.0.jar. Support for Ruby script execution (https://www.jruby.org/). Only required for RubyJob usage.&lt;br /&gt;
* jmustache-1.12.jar. Provides email templating.&lt;br /&gt;
* h2-1.4.192.  H2 database and JDBC driver.  Only required for running H2.&lt;br /&gt;
* log4j-1.2.9.jar.  Obsidian logging uses log4j.&lt;br /&gt;
* mariadb-java-client-1.4.5.jar.  MySQL JDBC driver. Only required for running against MySQL or MariaDB.&lt;br /&gt;
* jtds-1.3.1.jar. SQL Server JDBC driver.  Only required for running SQLServer.&lt;br /&gt;
* ojdbc7-12.1.0.1.jar.  Oracle JDBC driver.  Only required for running Oracle.&lt;br /&gt;
* postgresql-9.4.1208.jre7.jar. PostgreSQL JDBC driver.  Only required for running PostgreSQL.&lt;br /&gt;
* opencsv-3.8.jar. Support for CSV downloads in UI.&lt;br /&gt;
* flexmark-0.19.6.jar, flexmark-util-0.19.6.jar (as of 4.3.0). Markdown formatting for Description and Parameter job annotations.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 4.5.1&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* groovy-all-2.4.7.jar. Support for Groovy script execution (https://groovy-lang.org/).  Only required for GroovyJob usage.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 4.0.0&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* javax.mail-1.5.2.jar.  Used for email notifications.&lt;br /&gt;
* jstl.jar, standard.jar.  Web utilities. Only required in web administration.&lt;br /&gt;
* gson-2.2.2.jar. Supports REST API and web administration.&lt;br /&gt;
* groovy-all-2.1.8.jar.  Support for Groovy script execution (https://groovy-lang.org/).  Only required for GroovyJob usage.&lt;br /&gt;
* jython-standalone-2.5.3.jar.  Support for Python script execution (https://www.jython.org/).  Only required for PythonJob usage.&lt;br /&gt;
* jmustache-1.8.jar. Provides email templating.&lt;br /&gt;
* h2-1.3.154. H2 database and JDBC driver.  Only required for running H2.&lt;br /&gt;
* mariadb-java-client-1.1.5.jar. MySQL JDBC driver. Only required for running against MySQL or MariaDB.&lt;br /&gt;
* jtds-1.2.8.jar. SQL Server JDBC driver.  Only required for running SQLServer.&lt;br /&gt;
* ojdbc6-11.2.0.3.jar. Oracle JDBC driver.  Only required for running Oracle.&lt;br /&gt;
* postgresql-9.0-801.jdbc4.jar.  PostgreSQL JDBC driver.  Only required for running PostgreSQL.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 2.9.1&#039;&#039;&#039;, the following redundant library was in included in the Obsidian packaging.&lt;br /&gt;
* smtp.jar.  Used for email notifications.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 2.2.0&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* groovy-all-1.7.6.jar&lt;br /&gt;
* jython.jar (version 2.5.2rc2)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 2.1.1&#039;&#039;&#039;, the following libraries were also included.&lt;br /&gt;
* carfey-date-1.2.jar or carfey-date-1.1.jar.  Date math/manipulation.&lt;br /&gt;
* jdk-gen.jar, jdk.jar, suite-gen.jar, suite.jar.  Core Obsidian libs.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 2.1.0&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* ojdbc14.jar Oracle JDBC driver.  Only required for running Oracle.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Prior to Obsidian 1.5&#039;&#039;&#039;, the following older libraries were in use.&lt;br /&gt;
* gson-1.5.jar. Supports REST API and web administration.&lt;br /&gt;
&lt;br /&gt;
=== Required Libraries for Embedded API ===&lt;br /&gt;
&lt;br /&gt;
To use the [[Embedded_API|Embedded API]], the following resources should be imported. If you have newer versions of the same JARs in your application, feel free to use the newer version. The JAR files below can generally be found in the &#039;&#039;standalone&#039;&#039; directory if your installation. The &amp;lt;code&amp;gt;com.carfey.properties&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;com.carfey.yaml&amp;lt;/code&amp;gt; file can be extracted from the &amp;lt;code&amp;gt;obsidian-props.jar&amp;lt;/code&amp;gt;/&amp;lt;code&amp;gt;obsidian-yaml-configuration.jar&amp;lt;/code&amp;gt; in the &#039;&#039;standalone&#039;&#039; directory, or from an Obsidian WAR file under &amp;lt;code&amp;gt;WEB-INF/classes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
* com.carfey.properties/com.carfey.yaml (configuration file), or obsidian-props.jar, which contains the configuration file&lt;br /&gt;
* obsidian.jar&lt;br /&gt;
* dom4j-2.1.3.jar&lt;br /&gt;
* flexmark-0.62.2.jar, flexmark-util-0.62.2.jar&lt;br /&gt;
* gson-2.10.1&lt;br /&gt;
* log4j-api-2.17.0.jar, log4j-core-2.17.0.jar&lt;br /&gt;
* Appropriate JDBC JAR (e.g. mariadb-java-client-2.7.2.jar for MySQL or MariaDB)&lt;br /&gt;
&lt;br /&gt;
In addition, the following resources should be included if you wish to have notification support enabled when using the API:&lt;br /&gt;
* jmustache-1.15.jar&lt;br /&gt;
** jakarta.activation-api-2.1.2.jar, jakarta.mail-api-2.1.2.jar. Used for Jakarta EE email notifications.&lt;br /&gt;
** angus-activation-2.0.1.jar, angus-mail-2.0.2.jar. Optionally used with Jakarta EE email notifications.&lt;br /&gt;
** activation-1.1.jar, javax.mail-1.6.2.jar. Used for javamail (javax) email notifications.&lt;br /&gt;
&lt;br /&gt;
Finally, if you need to configure scripting jobs from the API, you will need to include any applicable JARs from the following list:&lt;br /&gt;
* apache-groovy-all-4.0.24.jar&lt;br /&gt;
* bsh-2.0b5.jar&lt;br /&gt;
* jruby-9.2.17.0.jar&lt;br /&gt;
* jython-standalone-2.7.2.jar&lt;br /&gt;
&lt;br /&gt;
== Disabling Job Execution &amp;amp; Scheduling in the Web Application ==&lt;br /&gt;
See the instructions within the [[Getting_Started#Disabling_Job_Scheduling_in_the_Web_Application|Getting Started Guide]].&lt;br /&gt;
&lt;br /&gt;
== Disabling Automatic Database Updates ==&lt;br /&gt;
See the instructions within the [[Getting_Started#Disabling_Automatic_Database_Updates|Getting Started Guide]].&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Admin_Global_Parameters&amp;diff=4063</id>
		<title>Admin Global Parameters</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Admin_Global_Parameters&amp;diff=4063"/>
		<updated>2026-05-16T11:28:35Z</updated>

		<summary type="html">&lt;p&gt;Craig: /* Customized Access Control */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Implementing_Jobs#Global_Parameters|Global Parameters]] allow you to configure job parameters globally, and then simply import them into jobs as needed.  This screen can be accessed from the primary navigation sidebar, underneath the Configuration parent menu item. &lt;br /&gt;
&lt;br /&gt;
= Global Parameters =&lt;br /&gt;
&lt;br /&gt;
By default, Users who have &#039;&#039;Write&#039;&#039; privileges will be able to edit and save values. Users who have &#039;&#039;Limited Read&#039;&#039; access will see obfuscated values instead of the true configuration values (see [[Admin_Global_Parameters#Customized_Access_Control|Access Control]]).&lt;br /&gt;
&lt;br /&gt;
== Customized Access Control==&lt;br /&gt;
By default, &#039;&#039;&#039;Write&#039;&#039;&#039; users may edit global parameters, and all users except &#039;&#039;Limited Read&#039;&#039; users may view them in clear text. [[Admin Scheduler Settings|Scheduler settings]] &amp;lt;code&amp;gt;globalParamEditAdminRequired&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;globalParamReadAdminRequired&amp;lt;/code&amp;gt; under the &#039;&#039;Dashboard&#039;&#039; category can be used to change this behaviour to restrict these abilities to &#039;&#039;Admin&#039;&#039; users. The former is used to exposed write privileges only to &#039;&#039;Admin&#039;&#039; users, and the latter is used to disallow users other than &#039;&#039;Admin&#039;&#039; users to view actual configured values instead of obfuscated text.&lt;br /&gt;
&lt;br /&gt;
== Editing Global Parameters ==&lt;br /&gt;
&lt;br /&gt;
This screen allows users to either view or edit global parameter values.&lt;br /&gt;
&lt;br /&gt;
To add a global parameter, click the &#039;&#039;Add Parameter&#039;&#039; button. Global parameters always allow multiple values since they have no fixed definition, and you may add values by clicking the (+) and trash buttons to the right of the field. Any entered values will be validated against the selected type, and the selected type will determine how they are stored. Note that the defined type does not have to match the type of job parameters that reference it - Obsidian will perform automatic type conversion where possible. Data types are defined here so that you can avoid configuration errors.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;Remove&#039;&#039; button will remove the parameter and all its values.&lt;br /&gt;
&lt;br /&gt;
[[Image:GlobalParameters_4.0.png]]&lt;br /&gt;
&lt;br /&gt;
== Saving ==&lt;br /&gt;
&lt;br /&gt;
To save your configuration changes, click the Save button at the bottom of the form. If there are problems with your changes, you will be notified at the top of the screen. You can then correct your entered information and re-save. Upon success, you will see a success confirmation.&lt;br /&gt;
&lt;br /&gt;
== Job Validation ==&lt;br /&gt;
&lt;br /&gt;
When saving changes, any jobs that reference global parameters will be re-validated, which may result in a validation error which prevents you from saving your changes. This is to ensure that jobs always have valid configuration based on their defined parameters, that all referenced global parameters exist, and that data types are consistent. [[Implementing_Jobs#Global_Parameters|Parameterization - Global Parameters]] has more detail on global parameter validation.&lt;br /&gt;
&lt;br /&gt;
== Using Global Parameters in Jobs ==&lt;br /&gt;
&lt;br /&gt;
A global parameter must be defined before using it in a job.&lt;br /&gt;
&lt;br /&gt;
To use an existing global parameter in a job, instead of supplying a literal value, you will supply the global parameter name surrounded by double curly braces (e.g. &amp;lt;code&amp;gt;&amp;amp;#123;&amp;amp;#123;param&amp;amp;#125;&amp;amp;#125;&amp;lt;/code&amp;gt;). Obsidian will see this is a global parameter reference and will import the global parameter values in its place when validating the job and when executing it. The [[Admin Jobs#Global Parameters|Jobs]] screen page has more detail on referencing global parameters.&lt;br /&gt;
&lt;br /&gt;
[[File:Obsidian-6.2.0-Global-Parameter-Mouseover.png]]&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Planned_Releases&amp;diff=4062</id>
		<title>Planned Releases</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Planned_Releases&amp;diff=4062"/>
		<updated>2026-05-14T23:16:42Z</updated>

		<summary type="html">&lt;p&gt;Craig: /* Upcoming Features */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Upcoming Features ==&lt;br /&gt;
* OIDC support&lt;br /&gt;
* SAML support&lt;br /&gt;
* Autocomplete in UI for Global Parameters&lt;br /&gt;
* Event Hooks can be registered via the UI and APIs.&lt;br /&gt;
* Native authentication to supports automatic account disabling on repeated failed attempts&lt;br /&gt;
* Web Installer&lt;br /&gt;
* ConfigValidatingJob to support warnings&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Main_Page&amp;diff=4061</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Main_Page&amp;diff=4061"/>
		<updated>2026-01-24T19:38:06Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;[[Obsidian]]&#039;&#039;&#039; is a fully-featured Java-based scheduling application which supports load balancing, failover and job workflow. It is designed for [[Deployment Diagram|high availability]], and it is specially built for demanding scheduling environments.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[[Release_Notes#Obsidian_6.4.0|Version 6.4.0]]&#039;&#039;&#039; is the latest release, and was released in December 2025.&lt;br /&gt;
&lt;br /&gt;
Check out &#039;&#039;&#039;[[Getting Started]]&#039;&#039;&#039; if you are looking to set up Obsidian.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;[[User Guide]]&#039;&#039;&#039; will provide all the information you need to use all of Obsidian&#039;s functionality, and provides a quick view of the features Obsidian supports.&lt;br /&gt;
&lt;br /&gt;
Our &#039;&#039;&#039;[[FAQ]]&#039;&#039;&#039; is also worth checking out if you have questions about Obsidian or want more context about what it does.&lt;br /&gt;
&lt;br /&gt;
== Full Administration Capabilities ==&lt;br /&gt;
&lt;br /&gt;
Obsidian features a rich administration web interface, allowing easy monitoring and management. See the &#039;&#039;&#039;[[Admin Web Application Guide]]&#039;&#039;&#039; for details.&lt;br /&gt;
&lt;br /&gt;
[[Image:ObsidianNav 4.0.png]]&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=Main_Page&amp;diff=4060</id>
		<title>Main Page</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=Main_Page&amp;diff=4060"/>
		<updated>2026-01-24T19:24:19Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;[[Obsidian]]&#039;&#039;&#039; is a fully-featured Java-based scheduling application which supports load balancing, failover and job workflow. It is designed for [[Deployment Diagram|high availability]], and it is specially built for demanding scheduling environments.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;[[Release_Notes#Obsidian_6.4.0|Version 6.4.0]]&#039;&#039;&#039; is the latest release, and was released in December 2025.yrdy&lt;br /&gt;
&lt;br /&gt;
Check out &#039;&#039;&#039;[[Getting Started]]&#039;&#039;&#039; if you are looking to set up Obsidian.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;[[User Guide]]&#039;&#039;&#039; will provide all the information you need to use all of Obsidian&#039;s functionality, and provides a quick view of the features Obsidian supports.&lt;br /&gt;
&lt;br /&gt;
Our &#039;&#039;&#039;[[FAQ]]&#039;&#039;&#039; is also worth checking out if you have questions about Obsidian or want more context about what it does.&lt;br /&gt;
&lt;br /&gt;
== Full Administration Capabilities ==&lt;br /&gt;
&lt;br /&gt;
Obsidian features a rich administration web interface, allowing easy monitoring and management. See the &#039;&#039;&#039;[[Admin Web Application Guide]]&#039;&#039;&#039; for details.&lt;br /&gt;
&lt;br /&gt;
[[Image:ObsidianNav 4.0.png]]&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=MediaWiki:Monobook.css&amp;diff=4059</id>
		<title>MediaWiki:Monobook.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=MediaWiki:Monobook.css&amp;diff=4059"/>
		<updated>2026-01-21T21:58:35Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* All CSS here will be loaded for users of the MonoBook skin */&lt;br /&gt;
&lt;br /&gt;
/* MonoBook: left (namespace) tabs – green + Title Case */&lt;br /&gt;
#p-namespaces #ca-nstab-main a,&lt;br /&gt;
#p-namespaces #ca-talk a {&lt;br /&gt;
  color: #59A399 !important;&lt;br /&gt;
  text-transform: capitalize !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Optional: keep “Discussion” from going red when the talk page doesn&#039;t exist */&lt;br /&gt;
#p-namespaces #ca-talk.new a,&lt;br /&gt;
#p-namespaces #ca-talk a.new {&lt;br /&gt;
  color: #59A399 !important;&lt;br /&gt;
  text-transform: capitalize !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-views a,&lt;br /&gt;
#p-cactions a {&lt;br /&gt;
  color: #59A399 !important;&lt;br /&gt;
  text-transform: capitalize !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=MediaWiki:Monobook.css&amp;diff=4058</id>
		<title>MediaWiki:Monobook.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=MediaWiki:Monobook.css&amp;diff=4058"/>
		<updated>2026-01-21T21:57:51Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* All CSS here will be loaded for users of the MonoBook skin */&lt;br /&gt;
&lt;br /&gt;
/* MonoBook: left (namespace) tabs – green + Title Case */&lt;br /&gt;
#p-namespaces #ca-nstab-main a,&lt;br /&gt;
#p-namespaces #ca-talk a {&lt;br /&gt;
  color: #008000 !important;&lt;br /&gt;
  text-transform: capitalize !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Optional: keep “Discussion” from going red when the talk page doesn&#039;t exist */&lt;br /&gt;
#p-namespaces #ca-talk.new a,&lt;br /&gt;
#p-namespaces #ca-talk a.new {&lt;br /&gt;
  color: #008000 !important;&lt;br /&gt;
  text-transform: capitalize !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-views a,&lt;br /&gt;
#p-cactions a {&lt;br /&gt;
  color: #008000 !important;&lt;br /&gt;
  text-transform: capitalize !important;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=MediaWiki:Monobook.css&amp;diff=4057</id>
		<title>MediaWiki:Monobook.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=MediaWiki:Monobook.css&amp;diff=4057"/>
		<updated>2026-01-21T21:57:01Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* All CSS here will be loaded for users of the MonoBook skin */&lt;br /&gt;
&lt;br /&gt;
/* MonoBook: left (namespace) tabs – green + Title Case */&lt;br /&gt;
#p-namespaces #ca-nstab-main a,&lt;br /&gt;
#p-namespaces #ca-talk a {&lt;br /&gt;
  color: #008000 !important;&lt;br /&gt;
  text-transform: capitalize;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Optional: keep “Discussion” from going red when the talk page doesn&#039;t exist */&lt;br /&gt;
#p-namespaces #ca-talk.new a,&lt;br /&gt;
#p-namespaces #ca-talk a.new {&lt;br /&gt;
  color: #008000 !important;&lt;br /&gt;
  text-transform: capitalize;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-views a,&lt;br /&gt;
#p-cactions a {&lt;br /&gt;
  color: #008000 !important;&lt;br /&gt;
  text-transform: capitalize;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
	<entry>
		<id>https://wiki.obsidianscheduler.com/doc/index.php?title=MediaWiki:Monobook.css&amp;diff=4056</id>
		<title>MediaWiki:Monobook.css</title>
		<link rel="alternate" type="text/html" href="https://wiki.obsidianscheduler.com/doc/index.php?title=MediaWiki:Monobook.css&amp;diff=4056"/>
		<updated>2026-01-21T21:55:50Z</updated>

		<summary type="html">&lt;p&gt;Craig: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;/* All CSS here will be loaded for users of the MonoBook skin */&lt;br /&gt;
&lt;br /&gt;
/* MonoBook: left (namespace) tabs – green + Title Case */&lt;br /&gt;
#p-namespaces #ca-nstab-main a,&lt;br /&gt;
#p-namespaces #ca-talk a {&lt;br /&gt;
  color: #008000 !important;&lt;br /&gt;
  text-transform: capitalize;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
/* Optional: keep “Discussion” from going red when the talk page doesn&#039;t exist */&lt;br /&gt;
#p-namespaces #ca-talk.new a,&lt;br /&gt;
#p-namespaces #ca-talk a.new {&lt;br /&gt;
  color: #008000 !important;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
#p-views a,&lt;br /&gt;
#p-cactions a {&lt;br /&gt;
  color: #008000 !important;&lt;br /&gt;
  text-transform: capitalize;&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Craig</name></author>
	</entry>
</feed>