This commit is contained in:
Tiberiu Ichim 2026-02-05 18:08:45 +02:00
parent 5b9b43640b
commit a627dd5009
4 changed files with 105 additions and 20 deletions

View file

@ -14,6 +14,7 @@ This is a **local development deployment** of [Audiobookshelf](https://audiobook
## Technology Stack ## Technology Stack
### Backend ### Backend
- **Runtime**: Node.js (v20) - **Runtime**: Node.js (v20)
- **Framework**: Express.js with Socket.IO - **Framework**: Express.js with Socket.IO
- **Database**: SQLite3 with Sequelize ORM - **Database**: SQLite3 with Sequelize ORM
@ -25,6 +26,7 @@ This is a **local development deployment** of [Audiobookshelf](https://audiobook
- `nodemailer` - Email notifications - `nodemailer` - Email notifications
### Frontend ### Frontend
- **Framework**: Nuxt.js (Vue.js) - **Framework**: Nuxt.js (Vue.js)
- **State Management**: Vuex - **State Management**: Vuex
- **CSS**: Custom styles with PostCSS - **CSS**: Custom styles with PostCSS
@ -112,8 +114,10 @@ docker buildx build --platform linux/amd64,linux/arm64 -t advplyr/audiobookshelf
1. **Node.js v20** and **FFmpeg** are required 1. **Node.js v20** and **FFmpeg** are required
2. Create `dev.js` in root directory for local configuration (see `.devcontainer/dev.js` for example) 2. Create `dev.js` in root directory for local configuration (see `.devcontainer/dev.js` for example)
3. Default development ports: 3. Default development ports:
- Server: `3333`
- Client (dev): `3000` - Server: `3333`
- Client (dev): `3000`
4. Access the running instance directly on `localhost:3333` 4. Access the running instance directly on `localhost:3333`
## Important Notes ## Important Notes
@ -138,6 +142,7 @@ OpenAPI documentation available at `docs/openapi.json`
## Database Migrations ## Database Migrations
Located in `server/migrations/`. Key migrations include: Located in `server/migrations/`. Key migrations include:
- v2.15.0+ - Schema improvements - v2.15.0+ - Schema improvements
- v2.17.x - Foreign key constraints and indices - v2.17.x - Foreign key constraints and indices
- v2.19.x - Library item improvements - v2.19.x - Library item improvements
@ -145,6 +150,61 @@ Located in `server/migrations/`. Key migrations include:
Run migrations automatically on server startup. Run migrations automatically on server startup.
## Portable Database Setup
The database uses **relative paths** for portability. When moving the entire project folder:
### Path Structure
| Data Type | Database Path | Actual Location |
| ------------ | ---------------------------- | ------------------------------ |
| Audiobooks | `audiobooks/` | `./data/audiobooks/` |
| Cover images | `metadata/metadata/items/` | `./metadata/metadata/items/` |
| Backups | `metadata/metadata/backups/` | `./metadata/metadata/backups/` |
### Migration Script
Run the migration script to convert absolute Docker paths to relative paths:
```bash
./scripts/migrate_to_relative_paths.sh
```
This script:
1. Creates a backup at `config/absdatabase.sqlite.backup`
2. Converts `libraryFolders.path` to relative paths
3. Converts `libraryItems.path` and `relPath` to relative paths
4. Converts `books.coverPath` to relative paths
5. Updates `settings.backupPath` in JSON configuration
6. Creates necessary directory structure
### Directory Structure (Created by Migration)
```
data/
audiobooks/
metadata/
metadata/
items/
backups/
cache/
logs/
streams/
config/
absdatabase.sqlite
absdatabase.sqlite.backup
```
### Starting the Server
```bash
cd /mnt/docker/work/books/audiobookshelf
npm run dev
```
The server will resolve all paths relative to the current working directory.
## Related Documentation ## Related Documentation
- [Main Documentation](https://audiobookshelf.org/docs) - [Main Documentation](https://audiobookshelf.org/docs)

View file

@ -2,7 +2,7 @@ SCRIPTS_DIR := scripts
.DEFAULT_GOAL := help .DEFAULT_GOAL := help
.PHONY: help db-dump-all db-dump-folders db-dump-items db-dump-books db-dump-feeds db-dump-settings db-summary .PHONY: help db-dump-all db-dump-folders db-dump-items db-dump-books db-dump-feeds db-dump-settings db-summary frontend-start backend-start
help: help:
@echo "Audiobookshelf Database Migration Tools" @echo "Audiobookshelf Database Migration Tools"
@ -35,3 +35,9 @@ db-dump-settings:
db-summary: db-summary:
@bash $(SCRIPTS_DIR)/dump_all.sh @bash $(SCRIPTS_DIR)/dump_all.sh
frontend-start:
cd client && npm run dev3
backend-start:
npm run dev

View file

@ -7,6 +7,7 @@
"scripts": { "scripts": {
"dev": "nuxt", "dev": "nuxt",
"dev2": "nuxt --hostname localhost --port 1337", "dev2": "nuxt --hostname localhost --port 1337",
"dev3": "nuxt --hostname localhost --port 13378",
"build": "nuxt build", "build": "nuxt build",
"start": "nuxt start", "start": "nuxt start",
"generate": "nuxt generate", "generate": "nuxt generate",

View file

@ -3,19 +3,23 @@
# Migration Script: Convert absolute paths to relative paths # Migration Script: Convert absolute paths to relative paths
# Makes the database portable within the current working directory # Makes the database portable within the current working directory
# #
# Expected structure after migration:
# - Audiobooks: ./data/audiobooks/, ./data/romance/
# - Covers: ./metadata/metadata/items/
# - Backups: ./metadata/metadata/backups/
#
set -e set -e
DB_SOURCE="/mnt/docker/work/books/audiobookshelf/config/absdatabase.sqlite" DB_SOURCE="/mnt/docker/work/books/audiobookshelf/config/absdatabase.sqlite"
DB_BACKUP="/mnt/docker/work/books/audiobookshelf/config/absdatabase.sqlite.backup" DB_BACKUP="/mnt/docker/work/books/audiobookshelf/config/absdatabase.sqlite.backup"
DB_MIGRATED="/mnt/docker/work/books/audiobookshelf/config/absdatabase.sqlite"
echo "=== Audiobookshelf Path Migration ===" echo "=== Audiobookshelf Path Migration ==="
echo "Converting absolute paths to relative paths for portability" echo "Converting absolute paths to relative paths for portability"
echo "" echo ""
# Step 1: Create backup # Step 1: Create backup
echo "[1/4] Creating backup at $DB_BACKUP..." echo "[1/5] Creating backup at $DB_BACKUP..."
if [ -f "$DB_BACKUP" ]; then if [ -f "$DB_BACKUP" ]; then
echo " Backup already exists, removing..." echo " Backup already exists, removing..."
rm -f "$DB_BACKUP" rm -f "$DB_BACKUP"
@ -25,20 +29,15 @@ echo " Backup created successfully"
echo "" echo ""
# Step 2: Show current state # Step 2: Show current state
echo "[2/4] Current state:" echo "[2/5] Current state:"
echo " Library folders:" echo " Library folders:"
sqlite3 "$DB_SOURCE" "SELECT id, path FROM libraryFolders;" | while read line; do sqlite3 "$DB_SOURCE" "SELECT id, path FROM libraryFolders;" | while read line; do
echo " - $line" echo " - $line"
done done
echo "" echo ""
echo " Settings with paths:"
sqlite3 "$DB_SOURCE" "SELECT key, value FROM settings WHERE key LIKE '%path%' OR key IN ('backupPath');" | while read line; do
echo " - $line"
done
echo ""
# Step 3: Run migration # Step 3: Run migration
echo "[3/4] Migrating paths..." echo "[3/5] Migrating paths..."
# Migrate libraryFolders paths # Migrate libraryFolders paths
echo " Converting libraryFolders paths..." echo " Converting libraryFolders paths..."
@ -59,22 +58,35 @@ sqlite3 "$DB_SOURCE" "
echo " libraryItems: OK" echo " libraryItems: OK"
# Migrate book cover paths # Migrate book cover paths
# Handle both original (/metadata/items/) and already-migrated (metadata/metadata/items/)
echo " Converting book cover paths..." echo " Converting book cover paths..."
sqlite3 "$DB_SOURCE" " sqlite3 "$DB_SOURCE" "
UPDATE books SET coverPath = REPLACE(coverPath, '/metadata/items/', 'metadata/items/'); UPDATE books SET coverPath = REPLACE(coverPath, '/metadata/items/', 'metadata/metadata/items/');
" "
echo " books: OK" echo " books: OK"
# Migrate settings (backupPath) # Migrate settings (backupPath in JSON)
echo " Converting settings..." echo " Converting settings..."
sqlite3 "$DB_SOURCE" " sqlite3 "$DB_SOURCE" "
UPDATE settings SET value = 'metadata/backups' WHERE key = 'backupPath' AND value = '/metadata/backups'; UPDATE settings SET value = REPLACE(value, '\"backupPath\":\"/metadata/backups\"', '\"backupPath\":\"metadata/metadata/backups\"') WHERE key = 'server-settings';
" "
echo " settings: OK" echo " settings: OK"
# Verify migration # Step 4: Create necessary directories
echo "" echo ""
echo "[4/4] Verification:" echo "[4/5] Creating directory structure..."
mkdir -p data/audiobooks
mkdir -p data/romance
mkdir -p metadata/metadata/items
mkdir -p metadata/metadata/backups
mkdir -p metadata/metadata/cache
mkdir -p metadata/metadata/logs
mkdir -p metadata/metadata/streams
echo " Directories created"
# Step 5: Verification
echo ""
echo "[5/5] Verification:"
echo " Library folders after migration:" echo " Library folders after migration:"
sqlite3 "$DB_SOURCE" "SELECT id, path FROM libraryFolders;" | while read line; do sqlite3 "$DB_SOURCE" "SELECT id, path FROM libraryFolders;" | while read line; do
echo " - $line" echo " - $line"
@ -86,12 +98,12 @@ sqlite3 "$DB_SOURCE" "SELECT DISTINCT substr(path, 1, 50) FROM libraryItems LIMI
done done
echo "" echo ""
echo " Sample cover paths:" echo " Sample cover paths:"
sqlite3 "$DB_SOURCE" "SELECT DISTINCT substr(coverPath, 1, 50) FROM books LIMIT 5;" | while read line; do sqlite3 "$DB_SOURCE" "SELECT DISTINCT substr(coverPath, 1, 60) FROM books LIMIT 5;" | while read line; do
echo " - $line" echo " - $line"
done done
echo "" echo ""
echo " Settings after migration:" echo " Settings backupPath:"
sqlite3 "$DB_SOURCE" "SELECT key, value FROM settings WHERE key LIKE '%path%' OR key IN ('backupPath');" | while read line; do sqlite3 "$DB_SOURCE" "SELECT json_extract(value, '$.backupPath') FROM settings WHERE key = 'server-settings';" | while read line; do
echo " - $line" echo " - $line"
done done
@ -100,5 +112,11 @@ echo "=== Migration Complete ==="
echo "Backup saved at: $DB_BACKUP" echo "Backup saved at: $DB_BACKUP"
echo "Database migrated: $DB_SOURCE" echo "Database migrated: $DB_SOURCE"
echo "" echo ""
echo "Directory structure created:"
echo " - ./data/audiobooks/"
echo " - ./data/romance/"
echo " - ./metadata/metadata/items/"
echo " - ./metadata/metadata/backups/"
echo ""
echo "To use the migrated database, run audiobookshelf from /mnt/docker/work/books/audiobookshelf:" echo "To use the migrated database, run audiobookshelf from /mnt/docker/work/books/audiobookshelf:"
echo " cd /mnt/docker/work/books/audiobookshelf && npm start" echo " cd /mnt/docker/work/books/audiobookshelf && npm start"