🐳 blackcandy

A self hosted music streaming server

Docker Ready Ports: 80 4,180 stars
1. Pull Image docker pull blackcandy-org/blackcandy:latest
2. 1-Click Launch Command docker run -d --name blackcandy -p 80:80 --restart always blackcandy-org/blackcandy:latest
Dockerfile
FROM node:20.11.0-alpine AS node
FROM ruby:4.0.2-alpine AS base
FROM base AS builder

ENV RAILS_ENV production
ENV NODE_ENV production

COPY --from=node /usr/local/bin/node /usr/local/bin/node
COPY --from=node /usr/local/lib/node_modules /usr/local/lib/node_modules

RUN ln -s /usr/local/lib/node_modules/npm/bin/npm-cli.js /usr/local/bin/npm

RUN apk add --no-cache tzdata libpq-dev build-base gcompat yaml-dev vips-dev

WORKDIR /rails

COPY Gemfile* /rails/

RUN bundle config --local without 'development test' \
  && bundle install -j4 --retry 3 \
  && bundle exec bootsnap precompile -j 0 --gemfile app/ lib/  \
  && bundle clean --force \
  && rm -rf /usr/local/bundle/cache \
  && find /usr/local/bundle/gems/ -name "*.c" -delete \
  && find /usr/local/bundle/gems/ -name "*.o" -delete

COPY . /rails

RUN SECRET_KEY_BASE_DUMMY=1 bundle exec rails assets:precompile \
  && npm cache clean --force \
  && rm -rf node_modules tmp/cache/* /tmp/* package-lock.json log/production.log app/javascript/* app/assets/* storage/*


FROM base

ARG COMMIT_HASH

ENV LANG=C.UTF-8 RAILS_ENV=production COMMIT_HASH=$COMMIT_HASH

LABEL service="blackcandy"

RUN apk add --no-cache \
  tzdata \
  libpq \
  vips \
  ffmpeg \
  curl \
  gcompat \
  jemalloc

WORKDIR /rails

EXPOSE 80

# Enable jemalloc for reduced memory usage and latency
ENV LD_PRELOAD=/usr/lib/libjemalloc.so.2

RUN addgroup -g 1000 -S app && adduser -u 1000 -S app -G app

COPY --from=tianon/gosu /gosu /usr/local/bin/
COPY --from=builder --chown=app:app /usr/local/bundle/ /usr/local/bundle/
COPY --from=builder --chown=app:app /rails/ /rails/

RUN find /rails/tmp -type d -exec chmod 1777 '{}' +

ENTRYPOINT ["./bin/docker-entrypoint"]

CMD ["./bin/thrust", "./bin/rails", "server"]