* feat(jellycompat): install web assets at runtime * fix(jellycompat): recover stale web operation locks * fix(jellycompat): harden web component management * feat(admin): refine compat settings and restart status * chore(dev): add hot-reload docker compose stack * fix(dev): include npm in hot-reload backend * feat(admin): refine Jellyfin compatibility settings * feat(settings): improve jellyfin proxy summary * feat(settings): improve jellyfin web controls * fix(settings): update jellyfin web removal status * fix(settings): enable jellyfin web after install * feat(jellycompat): auto-select web ui version * test(api): update rate limit handler setup * feat(jellycompat): refine web ui install onboarding * fix(jellycompat): address web ui install review issues * fix(onboarding): mirror jellyfin api runtime status * fix(admin): remove global restart banner * fix(settings): gate restart required tracking * fix(jellyfin): ignore live settings for restart status * fix(jellyfin): avoid restart for live compat settings * fix(subtitles): normalize AI language codes * fix(catalog): support partial title search tokens * feat(branding): add white-label customization * Add push relay engineering plan - Document relay API contracts, APNs/FCM behavior, auth, storage, and ops - Capture implementation plan, provider references, decisions, and README --------- Co-authored-by: Quick <31828688+Quick104@users.noreply.github.com>
182 lines
5.1 KiB
YAML
182 lines
5.1 KiB
YAML
# Development stack:
|
|
# docker compose -f docker-compose.dev.yml up --build
|
|
#
|
|
# Vite serves the UI at http://localhost:${PORT:-8090} and proxies API
|
|
# requests to the Air-reloaded Go backend on the compose network.
|
|
name: silo-dev
|
|
|
|
services:
|
|
postgres:
|
|
image: pgvector/pgvector:pg18
|
|
restart: unless-stopped
|
|
shm_size: ${POSTGRES_SHM_SIZE:-2gb}
|
|
environment:
|
|
POSTGRES_USER: ${POSTGRES_USER:-silo}
|
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-silo}
|
|
POSTGRES_DB: ${POSTGRES_DB:-silo}
|
|
ports:
|
|
- "${POSTGRES_PORT:-5432}:5432"
|
|
volumes:
|
|
- silo-dev-postgres:/var/lib/postgresql
|
|
command: ["postgres", "-c", "listen_addresses=*"]
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-silo}"]
|
|
interval: 5s
|
|
timeout: 3s
|
|
retries: 5
|
|
|
|
redis:
|
|
image: redis:alpine
|
|
restart: unless-stopped
|
|
ports:
|
|
- "${REDIS_PORT:-6379}:6379"
|
|
volumes:
|
|
- silo-dev-redis:/data
|
|
healthcheck:
|
|
test: ["CMD", "redis-cli", "ping"]
|
|
interval: 5s
|
|
timeout: 3s
|
|
retries: 5
|
|
|
|
silo:
|
|
build:
|
|
context: .
|
|
dockerfile_inline: |
|
|
FROM node:22-slim AS node_runtime
|
|
|
|
FROM golang:1.26
|
|
|
|
ENV CGO_ENABLED=1
|
|
ENV GOPROXY=direct
|
|
ENV GOPRIVATE=github.com/Silo-Server/*
|
|
ENV GONOSUMDB=github.com/Silo-Server/*
|
|
|
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
|
ca-certificates \
|
|
curl \
|
|
ffmpeg \
|
|
git \
|
|
libvips-dev \
|
|
pkg-config \
|
|
&& rm -rf /var/lib/apt/lists/*
|
|
|
|
COPY --from=node_runtime /usr/local/bin/node /usr/local/bin/node
|
|
COPY --from=node_runtime /usr/local/lib/node_modules/npm /usr/local/lib/node_modules/npm
|
|
RUN ln -sf ../lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm && \
|
|
ln -sf ../lib/node_modules/npm/bin/npx-cli.js /usr/local/bin/npx
|
|
|
|
RUN go install github.com/air-verse/air@latest
|
|
|
|
WORKDIR /app
|
|
restart: unless-stopped
|
|
working_dir: /app
|
|
command:
|
|
- sh
|
|
- -c
|
|
- |
|
|
mkdir -p tmp web/dist
|
|
if [ ! -f web/dist/index.html ]; then
|
|
printf '%s\n' '<!doctype html><html><body><div id="root"></div></body></html>' > web/dist/index.html
|
|
fi
|
|
|
|
cat >/tmp/air.docker.toml <<'AIR'
|
|
root = "."
|
|
tmp_dir = "tmp"
|
|
|
|
[build]
|
|
cmd = "go build -o ./tmp/silo ./cmd/silo/"
|
|
bin = "./tmp/silo"
|
|
args_bin = []
|
|
include_ext = ["go", "sql", "json"]
|
|
include_dir = ["cmd", "internal", "migrations"]
|
|
exclude_dir = ["tmp", "vendor", "third_party", "docs", "scripts", "web"]
|
|
exclude_regex = ["_test\\.go$"]
|
|
delay = 500
|
|
stop_on_error = true
|
|
kill_delay = 500
|
|
send_interrupt = true
|
|
|
|
[log]
|
|
time = true
|
|
|
|
[misc]
|
|
clean_on_exit = true
|
|
AIR
|
|
|
|
air -c /tmp/air.docker.toml
|
|
environment:
|
|
MODE: integrated
|
|
PORT: "8080"
|
|
DATABASE_URL: postgres://${POSTGRES_USER:-silo}:${POSTGRES_PASSWORD:-silo}@postgres:5432/${POSTGRES_DB:-silo}?sslmode=disable
|
|
REDIS_URL: redis://redis:6379
|
|
SILO_PLUGIN_CACHE_DIR: /var/lib/silo/plugins
|
|
POSTGRES_TUNE: "off"
|
|
ports:
|
|
- "${BACKEND_PORT:-18080}:8080"
|
|
- "${JF_PORT:-8096}:8096"
|
|
- "${ABS_PORT:-13378}:13378"
|
|
volumes:
|
|
- .:/app
|
|
- silo-dev-air-tmp:/app/tmp
|
|
- silo-dev-go-build:/root/.cache/go-build
|
|
- silo-dev-go-mod:/go/pkg/mod
|
|
- silo-dev-plugins:/var/lib/silo/plugins
|
|
- silo-dev-compat:/var/lib/silo/compat
|
|
- silo-dev-transcode:/tmp/silo-transcode
|
|
- silo-dev-audiobook-covers:/var/lib/silo/audiobook-covers
|
|
- ${MEDIA_ROOT:-/tmp/silo-dev-media}:${MEDIA_CONTAINER_ROOT:-/mnt/media}:ro
|
|
depends_on:
|
|
postgres:
|
|
condition: service_healthy
|
|
redis:
|
|
condition: service_healthy
|
|
healthcheck:
|
|
test: ["CMD", "curl", "-fsS", "http://localhost:8080/api/v1/health"]
|
|
interval: 5s
|
|
timeout: 3s
|
|
retries: 30
|
|
start_period: 10s
|
|
env_file:
|
|
- path: .env
|
|
required: false
|
|
|
|
web:
|
|
build:
|
|
context: .
|
|
dockerfile_inline: |
|
|
FROM node:22-slim
|
|
|
|
RUN corepack enable && corepack prepare pnpm@10.32.1 --activate
|
|
|
|
WORKDIR /app/web
|
|
restart: unless-stopped
|
|
working_dir: /app/web
|
|
command: sh -c "pnpm install --frozen-lockfile --store-dir /pnpm/store && pnpm run dev -- --host 0.0.0.0"
|
|
environment:
|
|
VITE_API_PROXY_TARGET: http://silo:8080
|
|
VITE_HMR_CLIENT_PORT: "${PORT:-8090}"
|
|
PNPM_STORE_DIR: /pnpm/store
|
|
CI: "true"
|
|
ports:
|
|
- "${PORT:-8090}:5173"
|
|
volumes:
|
|
- .:/app
|
|
- silo-dev-web-node-modules:/app/web/node_modules
|
|
- silo-dev-pnpm-store:/pnpm/store
|
|
depends_on:
|
|
silo:
|
|
condition: service_healthy
|
|
|
|
volumes:
|
|
silo-dev-air-tmp:
|
|
silo-dev-audiobook-covers:
|
|
silo-dev-compat:
|
|
silo-dev-go-build:
|
|
silo-dev-go-mod:
|
|
silo-dev-plugins:
|
|
silo-dev-pnpm-store:
|
|
silo-dev-postgres:
|
|
silo-dev-redis:
|
|
silo-dev-transcode:
|
|
silo-dev-web-node-modules:
|