commit 4321b0c4af0ec8866254de478c6085211204fe3d Author: Beda Schmid Date: Wed Aug 5 00:00:55 2026 +0000 Reset history to current sanitized state diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..64920b2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +.env +.env.* +*.env +*.env.* +!.env.example +!.env.*.example +!*.env.example +!*.env.*.example + +data/ +*.swp +.DS_Store + +# BEGIN reset-history environment exclusions +.env +.env.* +*.env +*.env.* +!.env.example +!.env.*.example +!*.env.example +!*.env.*.example +# END reset-history environment exclusions diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..efb9808 --- /dev/null +++ b/LICENSE @@ -0,0 +1,24 @@ +This is free and unencumbered software released into the public domain. + +Anyone is free to copy, modify, publish, use, compile, sell, or +distribute this software, either in source code form or as a compiled +binary, for any purpose, commercial or non-commercial, and by any +means. + +In jurisdictions that recognize copyright laws, the author or authors +of this software dedicate any and all copyright interest in the +software to the public domain. We make this dedication for the benefit +of the public at large and to the detriment of our heirs and +successors. We intend this dedication to be an overt act of +relinquishment in perpetuity of all present and future rights to this +software under copyright law. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR +OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, +ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + +For more information, please refer to diff --git a/README.md b/README.md new file mode 100644 index 0000000..898bd31 --- /dev/null +++ b/README.md @@ -0,0 +1,27 @@ +# AudioMuse-AI + +Self-hosted music analysis and playlist-generation service for discovering sonically related tracks in supported +music servers. + +## Deployment layout + +- **Compose:** `/srv/docker/audiomuse/docker-compose.yml` +- **Static configuration/source:** no additional static configuration or build source +- **Non-secret environment:** service roles, timezone, PostgreSQL topology, Redis URL, and temporary-audio paths are declared inline in Compose; there is no project-local `.env` +- **Secrets:** `/srv/docker/secrets/audiomuse/.env` +- **NVMe application state:** `/srv/appdata/audiomuse/postgres`, `/srv/appdata/audiomuse/redis`, `/srv/appdata/audiomuse/temp-audio-flask`, `/srv/appdata/audiomuse/temp-audio-worker`, `/srv/appdata/audiomuse/plugins-flask`, +and `/srv/appdata/audiomuse/plugins-worker` +- **Bulk HDD data:** none +- **Other mounts:** none + +Secrets are never committed to this repository. The central secret environment +is supplied to the PostgreSQL, Flask application, and worker services. + +## Dependencies and recovery + +- **Networks/dependencies:** the Flask application and worker depend on PostgreSQL and Redis through the private +`audiomuse_internal` network; both also use the external `npm_proxy` network at `192.168.97.25` and +`192.168.97.26` +- **Back up:** `/srv/appdata/audiomuse/postgres`, `/srv/appdata/audiomuse/plugins-flask`, `/srv/appdata/audiomuse/plugins-worker`, and the separately protected AudioMuse-AI secret environment +- **Re-creatable:** the containers, Redis queue state, and temporary-audio directories + diff --git a/docker-compose.yml b/docker-compose.yml new file mode 100644 index 0000000..6834271 --- /dev/null +++ b/docker-compose.yml @@ -0,0 +1,84 @@ +services: + # Redis service for RQ (task queue) + redis: + image: redis:7-alpine + container_name: audiomuse-redis + volumes: + - /srv/appdata/audiomuse/redis:/data + networks: + - audiomuse_internal + restart: unless-stopped + + # PostgreSQL database service + postgres: + image: postgres:15-alpine + container_name: audiomuse-postgres + env_file: + - /srv/docker/secrets/audiomuse/.env + environment: + POSTGRES_USER: "audiomuse" + POSTGRES_DB: "audiomusedb" + volumes: + - /srv/appdata/audiomuse/postgres:/var/lib/postgresql/data + networks: + - audiomuse_internal + restart: unless-stopped + + # AudioMuse-AI Flask application service + audiomuse-ai-flask: + image: ghcr.io/neptunehub/audiomuse-ai:latest + container_name: audiomuse-ai-flask-app + env_file: + - /srv/docker/secrets/audiomuse/.env + environment: + SERVICE_TYPE: "flask" + TZ: UTC + POSTGRES_USER: "audiomuse" + POSTGRES_DB: "audiomusedb" + POSTGRES_HOST: "postgres" + POSTGRES_PORT: "5432" + REDIS_URL: "redis://redis:6379/0" + TEMP_DIR: "/app/temp_audio" + volumes: + - /srv/appdata/audiomuse/temp-audio-flask:/app/temp_audio + - /srv/appdata/audiomuse/plugins-flask:/app/plugin/installed + depends_on: + - redis + - postgres + networks: + audiomuse_internal: + npm_proxy: + ipv4_address: 192.168.97.25 + restart: unless-stopped + + # AudioMuse-AI RQ Worker service + audiomuse-ai-worker: + image: ghcr.io/neptunehub/audiomuse-ai:latest + container_name: audiomuse-ai-worker-instance + env_file: + - /srv/docker/secrets/audiomuse/.env + environment: + SERVICE_TYPE: "worker" + TZ: UTC + POSTGRES_USER: "audiomuse" + POSTGRES_DB: "audiomusedb" + POSTGRES_HOST: "postgres" + POSTGRES_PORT: "5432" + REDIS_URL: "redis://redis:6379/0" + TEMP_DIR: "/app/temp_audio" + volumes: + - /srv/appdata/audiomuse/temp-audio-worker:/app/temp_audio + - /srv/appdata/audiomuse/plugins-worker:/app/plugin/installed + depends_on: + - redis + - postgres + networks: + audiomuse_internal: + npm_proxy: + ipv4_address: 192.168.97.26 + restart: unless-stopped + +networks: + audiomuse_internal: + npm_proxy: + external: true