ci / api / api (push) Successful in 26s
ci / mobile / mobile (Metro-бандл Android) (push) Failing after 22s
ci / contract / contract (сгенерированный код совпадает с openapi.yaml) (push) Successful in 37s
ci / ts / ts (packages + web) (push) Successful in 51s
ci / docker / docker (образы собираются — их сервер собирает сам при обновлении) (push) Successful in 53s
- schema for sources, path patterns, media files, artists, albums, tracks, genres (migration 00003) - path patterns (RE2 with named groups, skip), merge with tags by source priority, fallbacks from the file name and folder, name normalization and multi-artist split - scanner: walk, skip unchanged files by size and mtime, ffprobe in 8 workers with a single catalog writer, renames by content hash keep the track, duplicates fold into one track with the best file as primary, missing files are kept 30 days - storage-agent mounts NFS with validated server, export and an option whitelist, no shell; test mount counts audio files - admin API: sources CRUD, connection test, patterns with preview, scan, library status, file errors, host folder picker; scheduled scans and health checks; mounts are restored on start - catalog API: artist, artist albums, album with tracks, track - api image is alpine with ffmpeg for ffprobe Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
31 lines
1.5 KiB
Docker
31 lines
1.5 KiB
Docker
# syntax=docker/dockerfile:1
|
||
# Сборка из корня репозитория:
|
||
# docker build -f services/api/Dockerfile --target api --build-arg VERSION=1.2.3 .
|
||
# docker build -f services/api/Dockerfile --target storage-agent --build-arg VERSION=1.2.3 .
|
||
|
||
FROM golang:1.24-alpine AS build
|
||
WORKDIR /src
|
||
COPY services/api/go.mod services/api/go.sum ./
|
||
RUN --mount=type=cache,target=/go/pkg/mod go mod download
|
||
COPY services/api/ ./
|
||
ARG VERSION=0.0.0-dev
|
||
ENV CGO_ENABLED=0
|
||
RUN --mount=type=cache,target=/go/pkg/mod --mount=type=cache,target=/root/.cache/go-build \
|
||
go build -trimpath -ldflags "-s -w -X pipu/api/internal/buildinfo.Version=${VERSION}" -o /out/api ./cmd/api && \
|
||
go build -trimpath -ldflags "-s -w -X pipu/api/internal/buildinfo.Version=${VERSION}" -o /out/storage-agent ./cmd/storage-agent
|
||
|
||
# api вызывает ffprobe (сканер) и ffmpeg (транскодинг, M3) — нужен не distroless, а alpine с ffmpeg.
|
||
FROM alpine:3.22 AS api
|
||
RUN apk add --no-cache ffmpeg ca-certificates tzdata
|
||
COPY --from=build /out/api /usr/local/bin/api
|
||
USER 65532:65532
|
||
EXPOSE 8080
|
||
ENTRYPOINT ["/usr/local/bin/api"]
|
||
|
||
# Агенту нужны nfs-utils для mount -t nfs и root внутри контейнера (CAP_SYS_ADMIN задаётся в compose).
|
||
FROM alpine:3.22 AS storage-agent
|
||
RUN apk add --no-cache nfs-utils ca-certificates
|
||
COPY --from=build /out/storage-agent /usr/local/bin/storage-agent
|
||
EXPOSE 8090
|
||
ENTRYPOINT ["/usr/local/bin/storage-agent"]
|