Your retro-futuristic home AI assistant.
- 🎤 Voice-Driven AI: Natural language interaction via satellite Raspberry Pi units.
- 🧠 Conversational Intelligence: Integrates with Ollama or LM Studio for cutting-edge AI responses.
- 🏠 Smart Hub Control: Manage lights, media, and IoT devices seamlessly.
- 🧩 Home Assistant Integrations: Works hand-in-hand with Home Assistant for extensive smart home control.
- 💬 Client Chatbot: Interact with Orac through a web or desktop chatbot interface.
- 🌐 Supports Multiple LLM Services: Connects to LM Studio, Ollama, OpenAI, and more.
- 🛠 Modular Design: Easily extend Orac with custom skills and automations.
- 🐧 Linux Server Deployment: The supported Orac server deployment path is Linux-based.
- 🔑 Administered via APEX Web Console: User and configuration management through Oracle APEX at http://localhost:8042/ords/orac/f?p=1042:LOGIN.
- Installation
- Prerequisites
- Oracle Free Setup
- Internet Retrieval
- APEX Administration
- Backup and Restore
- Usage
- License
Clone the repository and install Orac in editable mode on the Linux machine that will host the Orac server:
git clone https://github.com/Avalon60/orac.git
cd orac
python3 -m venv .venv
source .venv/bin/activate
pip install -e .The database deployment scripts expect to run from a Linux host with bash, sudo, and Docker available.
The current local-database deployment path is implemented by bin/orac-db-deploy.sh. That script assumes:
- A Linux host for the Orac server runtime.
- Docker Engine is installed.
- The Docker daemon is running.
- Docker Buildx is available, because the script builds the database image with
docker buildx bake. sudoaccess is available, because the script creates and fixes ownership on the host persistence directory.- Python 3.9+ is installed for the Orac utilities.
- A local checkout of this repository exists on the target machine.
The deployment script currently supports only:
TOPOLOGY=db-local
If you are using a remote Oracle database topology, bin/orac-db-deploy.sh is not the correct setup path.
Orac uses an Oracle Database container for local configuration and metadata storage. The supported local setup path is:
- Configure
resources/config/orac.env. - Prepare a host directory for persistent Oracle data files.
- Create or confirm the
oracdatabase credential entry. - Run
bin/orac-db-deploy.shto build the image and start the Composeorac-dbservice.
bin/orac-db-deploy.sh uses the same Compose stack defaults as
bin/orac-ctl.sh: the Compose file under resources/docker/oracle and the
env file under resources/config, both resolved relative to the Orac base
directory. At minimum, review these settings:
COMPOSE_PROJECT_NAME=orac
ORAC_DB_CONTAINER_NAME=orac-db
CONTAINER_NAME=orac-db
ORADATA_DIR=/u01/orac-db/oradata
ORAC_IMAGE_NAME=orac
ORAC_IMAGE_TAG=latest
PORT_SQLNET=1521
PORT_HTTP=8042
PORT_EM=5500
TOPOLOGY=db-localImportant points:
TOPOLOGYmust remaindb-localfor this script.ORADATA_DIRis the host directory mounted into the container at/opt/oracle/oradata.PORT_HTTPdefaults to8042on the host, even though the container listens on8080.
By default, the database files persist under:
/u01/orac-db/oradataYou can change that location by editing ORADATA_DIR in resources/config/orac.env.
The deployment script will:
- Create the directory if it does not already exist.
- Run
sudo chown -R 54321:54321 "${ORADATA_DIR}"so the Oracle container user can write to it.
On a clean machine, prepare the parent location before running the deploy script if your environment requires it. For example:
sudo mkdir -p /u01/orac-db/oradata
sudo chown -R 54321:54321 /u01/orac-db/oradataChoose a location with enough free space for Oracle data files and one that you intend to keep across container rebuilds. If you delete the contents of ORADATA_DIR, the database state is lost.
Orac stores database connection credentials securely using the dbconn-mgr.sh utility. Credentials are encrypted and stored in ~/.Orac/dsn_credentials.ini.
Required credential: orac
Run the following command to create the database connection:
bin/dbconn-mgr.sh -c oracYou will be prompted for:
- Username:
ORAC - Password: Choose a password (this will be used for both
ORACandORAC_PLUGINdatabase users) - DSN: The database connection string (e.g.,
localhost:1521/FREEPDB1) - Wallet ZIP path: Optional, press Enter to skip if not using Oracle wallet
⚠️ The password you enter here is used by the container setup scripts to create theORACandORAC_PLUGINdatabase users automatically.
To list configured connections:
bin/dbconn-mgr.sh -lTo edit an existing connection:
bin/dbconn-mgr.sh -e oracOrac supports explicit-only internet retrieval for prompts such as:
Search the internet for information on Neil Armstrong.
What is the latest on the Artemis programme?
This is core Orac retrieval plumbing, not a normal user-facing plugin. Orac does not browse autonomously; it only searches when the user explicitly asks for online retrieval.
The current retrieval provider is SearXNG. Orac expects a reachable SearXNG service and calls its JSON search endpoint:
<base_url>/search?q=<query>&format=json
The default development configuration points to a local SearXNG service:
[retrieval]
internet_search_enabled = true
internet_search_mode = explicit_only
default_search_provider = searxng
max_search_results = 5
max_sources_to_fetch = 3
max_response_bytes = 256000
max_redirects = 3
cache_ttl_hours = 12
require_citations = true
[retrieval.searxng]
base_url = http://127.0.0.1:8888
autostart = true
host = 127.0.0.1
port = 8888
timeout_seconds = 10If no SearXNG service is running at that URL, Orac will fail closed with a message such as:
I could not retrieve online evidence for that request.
Long-lived Orac services are managed by Docker Compose. To let
bin/orac-ctl.sh start the local SearXNG sidecar, enable the search profile
through Orac configuration:
[retrieval.searxng]
base_url = http://127.0.0.1:8888
autostart = true
host = 127.0.0.1
port = 8888
timeout_seconds = 10Verify the JSON search endpoint before testing through Orac:
bin/orac-ctl.sh compose-check
bin/orac-ctl.sh start
curl 'http://127.0.0.1:8888/search?q=Neil%20Armstrong&format=json'The response should be JSON containing a results array. Useful service log
commands:
bin/orac-ctl.sh logs search
bin/orac-ctl.sh statusThe Orac Compose stack mounts resources/docker/oracle/searxng/settings.yml
into the SearXNG sidecar. That file enables search.formats for both html
and json; without json, SearXNG returns 403 Forbidden for the endpoint
Orac uses. The file is mounted writable because the SearXNG container entrypoint
normalises ownership during startup.
When deploying the stack outside the repository, copy the searxng directory
next to the Compose file:
<stack-dir>/docker-compose.yaml
<stack-dir>/searxng/settings.yml
For Dockge this means:
/opt/stacks/orac/compose.yaml
/opt/stacks/orac/searxng/settings.yml
Set SEARXNG_SECRET in the active stack env file to a non-default local value.
The sample resources/config/orac.env includes a development value.
If the SearXNG settings mount is added or changed after the container already exists, a normal restart is not enough because Docker does not add new bind mounts to an existing container. Recreate only the SearXNG service:
docker compose \
--env-file <ORAC_HOME>/resources/config/orac.env \
-f <ORAC_HOME>/resources/docker/oracle/docker-compose.yaml \
--profile search \
up -d --force-recreate orac-searxngIf port 8888 is already in use, change SEARXNG_PORT in the active Compose
env file and update resources/config/orac.ini:
[retrieval.searxng]
base_url = http://127.0.0.1:<port>
host = 127.0.0.1
port = <port>
timeout_seconds = 10Fetched pages are treated as untrusted evidence, not instructions. Orac validates result URLs before fetching, rejects local/private/internal address ranges, validates redirect targets, limits response size, and only processes HTML or plain text content in this MVP.
Local voice wake-word support uses openWakeWord as the recommended production backend. It runs locally, does not require a vendor account, and processes microphone PCM frames directly rather than using STT transcription.
Install the optional openWakeWord wake packages:
poetry install --no-root -E voice-wake-openwakewordOn Linux, microphone capture uses the existing sounddevice dependency and
may require system PortAudio packages such as portaudio19-dev.
The default development configuration uses the built-in hey_jarvis model to
prove the integration:
[voice]
activation_mode = openwakeword
wake_engine = openwakeword
openwakeword_model_names = hey_jarvis
openwakeword_threshold = 0.75
openwakeword_inference_framework = auto
wake_rearm_seconds = 1.0
console_timestamps = true
openwakeword_refractory_seconds = 2.0To use a future custom Hey Orac model, place the model under the runtime tree and configure its path:
[voice]
activation_mode = openwakeword
wake_engine = openwakeword
openwakeword_model_paths = ${ORAC_HOME}/var/models/wakeword/openwakeword/hey_orac.tflite
openwakeword_model_names =Packaged Orac wake-word models live under
${ORAC_HOME}/resources/models/wakeword/openwakeword. Local or custom
wake-word models should live under
${ORAC_HOME}/var/models/wakeword/openwakeword.
Piper voice models follow the same runtime-tree convention. By default Orac looks for Piper voices under:
[voice]
tts_engine = piper
tts_voice_dir = ${ORAC_HOME}/var/models/piperPut the Piper voice assets in that directory, or override tts_voice_dir if
you keep voices elsewhere. Orac also packages en_GB-alba-medium under
${ORAC_HOME}/resources/models/piper so the default Piper fallback can work
without downloading a voice first.
Kokoro can be used as a higher-quality optional TTS backend when a local
Kokoro-FastAPI or compatible OpenAI speech API service is running. Orac does
not bundle Kokoro and does not require it for normal operation. Either run the
Kokoro speech server yourself and point Orac at its local HTTP endpoint, or set
tts_kokoro_autostart = true and let bin/orac-ctl.sh manage the Compose
voice profile. The service must expose an OpenAI-compatible speech route and return
WAV audio.
The tested integration target is
remsky/Kokoro-FastAPI, which
provides Docker images and a local OpenAI-compatible speech API. Follow the
upstream project for current installation details. If you use
tts_kokoro_runtime = docker-cpu, Orac uses the CPU image from the Compose
definition and you do not need to put the image name in orac.ini.
bin/orac-ctl.sh compose-check
bin/orac-ctl.sh startFor NVIDIA GPU support, set tts_kokoro_runtime = docker-gpu. The Compose
service uses the GPU image and the Docker nvidia runtime; confirm the host
has NVIDIA Container Toolkit/runtime support before enabling it.
The upstream project also supports Docker Compose and direct uv startup.
Use those paths if you want a pinned checkout, local UI, custom model storage,
or non-Docker development.
After starting Kokoro-FastAPI, verify the endpoint from another terminal:
curl -sS \
-H 'Content-Type: application/json' \
-o /tmp/orac-kokoro-test.wav \
-X POST http://127.0.0.1:8880/v1/audio/speech \
-d '{
"model": "kokoro",
"voice": "af_heart",
"input": "Kokoro is available for Orac.",
"response_format": "wav"
}'
file /tmp/orac-kokoro-test.wavThe file command should report a WAV/RIFF audio file. If the curl command
fails, fix the Kokoro service before enabling tts_engine = kokoro in Orac.
Example Kokoro configuration:
[voice]
tts_engine = kokoro
tts_fallback_engine = piper
tts_kokoro_autostart = false
tts_kokoro_runtime = docker-cpu
tts_kokoro_container_name = orac-kokoro
tts_kokoro_host = 127.0.0.1
tts_kokoro_port = 8880
tts_kokoro_base_url = http://127.0.0.1:8880/v1
tts_kokoro_image =
tts_kokoro_model = kokoro
tts_kokoro_voice = af_heart
tts_kokoro_response_format = wav
tts_kokoro_timeout_seconds = 60
tts_kokoro_api_key_env =tts_kokoro_autostart = true allows bin/orac-ctl.sh start and
bin/orac-ctl.sh restart to activate the Compose voice profile when
tts_engine = kokoro. Readiness is checked after Compose starts the sidecar.
tts_kokoro_runtime selects how Kokoro is provided:
docker-cpu: Orac manages a CPU Kokoro container using an internal default image. This is the documented default.docker-gpu: Orac manages a GPU Kokoro container using an internal default image. This is advanced and may require compatible NVIDIA drivers, CUDA, Docker GPU support, and a PyTorch build compatible with the installed GPU.external: Orac does not start or stop a Kokoro container. It only usestts_kokoro_base_urland assumes the service is already running.
tts_kokoro_image is optional. Leave it blank for the internal image selected
by tts_kokoro_runtime; set it only as an advanced override.
Kokoro-FastAPI supports weighted voice blends. Orac passes the configured voice string through unchanged, so blends can be configured like this:
[voice]
tts_kokoro_voice = af_bella(2)+af_heart(1)tts_kokoro_base_url may be configured with or without /v1, and with or
without a trailing slash. These forms are equivalent:
tts_kokoro_base_url = http://127.0.0.1:8880
tts_kokoro_base_url = http://127.0.0.1:8880/
tts_kokoro_base_url = http://127.0.0.1:8880/v1
tts_kokoro_base_url = http://127.0.0.1:8880/v1/All resolve internally to:
http://127.0.0.1:8880/v1/audio/speech
Use tts_kokoro_voice to select the Kokoro voice. Leave
tts_fallback_engine = piper if Piper should speak a chunk when Kokoro is
unavailable or returns an error. Set tts_engine = piper to return to the
lightweight local backend.
Run a local wake-word smoke test with:
PYTHONPATH=src poetry run python -m orac_voice.voice_loop_local --voice-session --activation-mode openwakewordSet activation_mode = enter to disable wake-word detection and keep the
manual press-Enter flow.
If Orac hears its own spoken response and immediately wakes again, increase
wake_rearm_seconds, openwakeword_refractory_seconds, or
openwakeword_threshold. The hey_jarvis model is a proof model, not a
trained Hey Orac model, so some false activation is expected until a real Orac
wake model is supplied.
Local voice sessions also support a first-pass barge-in mode. The server emits
explicit tts_playback_started, tts_playback_finished,
tts_playback_cancelled, and tts_playback_error events from the TTS worker.
The voice client starts its barge-in monitor only after playback starts and
stops it when playback finishes, is cancelled, or fails. The recommended mode
is openwakeword, which requires the wake word again during TTS playback
before it sends a voice-cancel request to the Orac server. This avoids Orac
cancelling itself just because the microphone can hear the speaker output.
[voice]
barge_in_enabled = false
barge_in_mode = openwakeword
barge_in_min_speech_ms = 250
barge_in_grace_ms = 500
barge_in_cooldown_ms = 1000
barge_in_return_mode = wake_listening
barge_in_ignore_during_tts_start_ms = 300
barge_in_post_response_ms = 12000
barge_in_post_response_cancel_enabled = falseSet barge_in_enabled = true only when testing barge-in. Use
barge_in_return_mode = wake_listening when interruption should stop Orac
and then wait for the wake word again. command_capture remains available for
immediately recording a replacement command after interruption, but it is more
sensitive to microphone/speaker timing.
barge_in_post_response_cancel_enabled remains disabled by default; playback
lifecycle events, not post-response timers, are the normal source of truth for
when barge-in is active.
barge_in_mode = vad remains available as a diagnostic mode, but it does not
perform acoustic echo cancellation. If the microphone hears the speaker output,
VAD may falsely interrupt. Prefer barge_in_mode = openwakeword; if you must
test VAD-only barge-in, increase barge_in_grace_ms,
barge_in_ignore_during_tts_start_ms, or barge_in_min_speech_ms, raise the
normal vad_speech_start_threshold, lower speaker volume, or use
headphones/echo-cancelling input hardware.
stt_phrase remains available as a diagnostic fallback, but it is not a
production wake-word detector because it records and transcribes each candidate
phrase before activation.
Porcupine remains optional/vendor-gated. It requires Picovoice credentials and the Porcupine extra:
poetry install --no-root -E voice-wake-porcupine
PYTHONPATH=src poetry run python -m lib.api_key_store --set picovoice/access_keyDo not store the Picovoice AccessKey in resources/config/orac.ini; store it
encrypted in ~/.Orac/api_keys.ini.
If the orac credential does not already exist, bin/orac-db-deploy.sh will attempt to initialize it for you by calling:
bin/dbconn-mgr.sh -c oracRun:
bin/orac-db-deploy.shWhat the script does:
- Verifies that
resources/config/orac.envexists. - Verifies Docker is installed and the daemon is running.
- Ensures the persistent
ORADATA_DIRexists and is owned by UID/GID54321:54321. - Ensures the
oraccredential exists. - Reads the Oracle password from the stored
oraccredential. - Builds the local Orac database image with Docker Buildx.
- Starts the database container with these mappings:
Host SQL*Net port ${PORT_SQLNET} -> Container 1521
Host HTTP port ${PORT_HTTP} -> Container 8080
Host EM port ${PORT_EM} -> Container 5500
Host ORADATA_DIR ${ORADATA_DIR} -> /opt/oracle/oradata
- Waits for the log marker
= ORAC deployment complete =.
Useful options:
bin/orac-db-deploy.sh --dry-run
bin/orac-db-deploy.sh --force
bin/orac-db-deploy.sh --force --no-cacheNotes:
- If a container with the configured name already exists, the script stops unless you pass
--force. --forceremoves the existing container and deletes Oracle marker directories underORADATA_DIRbefore rebuilding.- The first build and deployment can take a significant amount of time. The script waits up to 30 minutes for completion.
Important:
bin/orac-db-deploy.shdeploys the Oracle database container, ORDS/APEX, and the Orac database objects.- At the end of that script, the database side is running, but the full Orac stack is not yet up.
- The Orac AI engine is a separate host process and must be started afterward.
For operational purposes, the Orac stack consists of:
- the Oracle database container
- ORDS / APEX served from that container
- the Orac AI engine running on the Linux host
bin/orac-db-deploy.sh only handles the first two items plus schema/app deployment. It does not start the AI engine.
After bin/orac-db-deploy.sh completes successfully, start the full stack with:
bin/orac-ctl.sh startThen confirm both halves are running:
bin/orac-ctl.sh statusIf you only want to start the AI engine after the database is already running, you can use:
bin/orac.sh startOrac’s user-management and configuration functions are handled through the Orac Admin APEX application, which provides a browser-based interface for maintaining users, skills, and system settings.
Once your Oracle Free / ORDS stack is running, open the Orac Admin app in a browser:
http://localhost:8042/ords/f?p=1042:LOGIN
This URL launches the Orac Administration Application login page.
| Setting | Value | Notes |
|---|---|---|
| Workspace | ORAC |
APEX workspace associated with the Orac schema. |
| Username | ORAC_ADMIN |
The initial administrative account. |
| Password | (set on first login) | You’ll be prompted to choose a password at initial sign-in. |
After first login, you can use the APEX interface to manage user accounts, roles, permissions, and configuration data.
💡 This application provides everyday administration of Orac — including user setup, role management, and configuration — with no command-line access required.
🧰 Developers who need to access the underlying APEX workspace can still do so via: http://localhost:8042/ords/r/apex/workspace-sign-in/oracle-apex-sign-in
🌍 If accessing from another machine or container, replace
localhostin the URL with your host’s IP address or hostname (e.g.,http://192.168.0.42:8042/ords/f?p=1042:LOGIN).
If you cannot access the Orac Admin application:
-
Verify ORDS is running: Check your container logs or terminal output — you should see a line like:
INFO ORDS has started and is listening on port 8042 -
Check the URL: Ensure the URL path ends with
f?p=1042:LOGIN(not the developer workspace path). -
Confirm port mapping (Docker): If running in a container, make sure port 8042 on the host maps to container port 8080:
docker ps
Look for
0.0.0.0:8042->8042/tcp. -
Clear browser cache or use incognito mode: Cached session tokens sometimes prevent APEX login pages from loading correctly.
-
Reset ORAC_ADMIN password (if forgotten): Connect via SQL*Plus or SQLcl:
ALTER USER ORAC_ADMIN IDENTIFIED BY new_password;
-
Check APEX version / installation: If the login page still fails to load, confirm that APEX is properly installed and configured in the PDB:
SELECT version FROM apex_release;
🧠 Tip: If the APEX listener doesn’t respond, restart the ORDS service or your container — it usually resolves transient startup timing issues.
Orac provides host-level backup and restore commands for the local
db-local deployment:
bin/orac-backup.sh /path/to/backup-directory
bin/orac-restore.sh /path/to/orac-backup-YYYYMMDD-HHMMSS.tar.gzThe backup command creates an archive named like:
orac-backup-YYYYMMDD-HHMMSS.tar.gz
By default, bin/orac-backup.sh backs up non-secret operational state:
- Oracle Data Pump export for
orac_core,orac_api,orac_code, and plugin-declared database schemas. - Host configuration from
resources/config/*.ini. - Plugin metadata and plugin versions.
- Requested, exported, and missing schema lists.
- Enabled foreign key metadata.
backup_manifest.json.
The script reads plugin database schemas from plugins/*.json. If a
manifest-declared schema is not present in the database, the backup records it
as missing and continues exporting the schemas that do exist.
Useful options:
bin/orac-backup.sh --dry-run /tmp/orac-backups
bin/orac-backup.sh --skip-db /tmp/orac-backups
bin/orac-backup.sh --container orac-db --pdb FREEPDB1 /tmp/orac-backups--skip-db skips the Data Pump export and creates a metadata/config archive.
Vault files are not included by default. This keeps the default backup non-secret.
To include the existing encrypted vault files as-is:
bin/orac-backup.sh --include-vaults /tmp/orac-backupsThis copies only these allow-listed files, if they exist:
dsn_credentials.iniapi_keys.ini
They are stored in the archive under:
vaults/machine_bound/
These files remain encrypted with the original machine's local key material and may not be decryptable on another host.
To create a portable vault export protected by a recovery passphrase:
bin/orac-backup.sh --export-vaults /tmp/orac-backupsThe command prompts silently for:
Vault export passphrase:
Confirm vault export passphrase:
For automation, put the passphrase in a secure file and set the
ORAC_VAULT_EXPORT_PASSPHRASE_FILE variable to the file path:
export ORAC_VAULT_EXPORT_PASSPHRASE_FILE=/secure/path/orac-vault-passphrase
bin/orac-backup.sh --export-vaults /tmp/orac-backupsDo not pass the passphrase itself as a command-line argument or environment
variable. The backup script only accepts a file path via
ORAC_VAULT_EXPORT_PASSPHRASE_FILE.
Portable vault exports are stored under:
vaults/portable/
vault_export.json.enc
vault_export_manifest.json
The default vault directory is ~/.Orac. Override it with:
export ORAC_VAULT_DIR=/path/to/vault-directory--include-vaults and --export-vaults are mutually exclusive.
Restore requires explicit confirmation:
bin/orac-restore.sh /tmp/orac-backups/orac-backup-YYYYMMDD-HHMMSS.tar.gzThe restore command:
- Extracts and reads
backup_manifest.json. - Warns if the backup Orac version or plugin versions differ from the current checkout.
- Requires you to type
RECOVERbefore any Data Pump import starts. - Disables currently enabled foreign key constraints for the imported schemas.
- Runs
impdp. - Re-enables the foreign key constraints it disabled before import.
The default restore mode imports table data into an already installed Orac schema set:
ORAC_RESTORE_CONTENT=data_only
ORAC_RESTORE_TABLE_EXISTS_ACTION=truncateThis passes content=data_only table_exists_action=truncate to impdp. The
restore keeps the installed schema objects, packages, views, grants, and
triggers in place, truncates the imported tables, and reloads their rows from
the dump. This avoids noisy ORA-31684/ORA-39111 metadata-exists messages
when restoring into an Orac database that has already been deployed.
Advanced restore mode override:
ORAC_RESTORE_TABLE_EXISTS_ACTION=truncate \
bin/orac-restore.sh /tmp/orac-backups/orac-backup-YYYYMMDD-HHMMSS.tar.gzSupported table handling values are the Oracle Data Pump modes skip,
append, and truncate for the default data-only restore. Use append only
with care because it can hit duplicate key errors when seed data already
exists.
To replay schema metadata as well as data, use:
ORAC_RESTORE_CONTENT=all \
ORAC_RESTORE_TABLE_EXISTS_ACTION=replace \
bin/orac-restore.sh /tmp/orac-backups/orac-backup-YYYYMMDD-HHMMSS.tar.gzFull metadata import is intended for carefully prepared targets. If the users, packages, views, grants, or triggers already exist, Data Pump can report metadata-exists errors even when table rows are imported.
Current limitation: bin/orac-restore.sh imports the database dump but does
not yet restore vaults/portable/vault_export.json.enc back into ~/.Orac.
Keep the recovery passphrase safe for the future vault restore command.
Use bin/orac-ctl.sh as the primary control script for the full Orac stack:
- Oracle database container
- ORDS / APEX HTTP endpoint
- Orac AI engine
Docker Compose is the deployment model for long-lived Orac services.
bin/orac-ctl.sh defaults to Compose and env files under the Orac base
directory resolved from the script location. Dockge is optional; Dockge users
can mirror the stack into /opt/stacks/orac with bin/orac-dockge-sync.sh,
while normal installed deployments can explicitly use /opt/orac/stack if preferred. See
docs/docker-compose-deployment.md.
Common commands:
bin/orac-ctl.sh start
bin/orac-ctl.sh stop
bin/orac-ctl.sh restart
bin/orac-ctl.sh status
bin/orac-ctl.sh compose-check
bin/orac-ctl.sh logs
bin/orac-ctl.sh logs ai
bin/orac-ctl.sh logs db
bin/orac-ctl.sh logs voice
bin/orac-ctl.sh logs searchWhat these do:
startStarts the required Docker Compose services, waits for the database, then starts the Orac AI engine.stopStops the Orac AI engine, then stops the Compose services.restartRestarts the full stack.statusShows Compose service status and Orac AI engine status.compose-checkValidates the active Compose stack and compares any existing DB container without changing Docker state.logsTails database / ORDS Compose service logs by default.logs aiShows Orac AI engine logs.logs dbShows database / ORDS container logs.logs voiceShows Kokoro sidecar logs.logs searchShows SearXNG sidecar logs.
The lower-level bin/orac.sh script is still available if you only want to control the AI engine itself:
bin/orac.sh start
bin/orac.sh stop
bin/orac.sh status
bin/orac.sh logsIf bin/orac-db-deploy.sh does not complete successfully, inspect the database container logs:
bin/orac-ctl.sh logs db
To monitor the deployment while it is still running:
bin/orac-ctl.sh logs db
This project is licensed under the MIT License - see the LICENSE file for details.
The name Orac pays homage to the iconic AI from Blake’s 7—a nod to retro science fiction with modern AI innovation.
"Logic is a wreath of pretty flowers which smell bad."
