Compare commits

..

4 Commits

Author SHA1 Message Date
Luis Pereira a458a85823 feat: added documentation on build and deploy docker based asteroid 2025-10-30 19:08:46 -04:00
Luis Pereira ab3acf1279 feat: add docker setup for asteroid app 2025-10-30 19:08:46 -04:00
Luis Pereira c4fd96289b feat: add custom env volume path for stream containers 2025-10-30 19:08:46 -04:00
Luis Pereira 0930fc2c1c fix: retry user initialization 2025-10-30 19:08:46 -04:00
7 changed files with 135 additions and 13 deletions

8
.dockerignore.asteroid Normal file
View File

@ -0,0 +1,8 @@
docker/
music/
data/
*.org
docker-compose.yml
Dockerfile*
Makefile
.git/

42
Dockerfile.asteroid Normal file
View File

@ -0,0 +1,42 @@
FROM debian:bookworm-slim AS builder
RUN apt-get update && \
apt-get install -y curl openssl ca-certificates \
git make sbcl rlwrap && \
rm -rf /var/lib/apt/lists/*
WORKDIR /app
# Copy asteroid source to container workdir
COPY . .
# Download Quicklisp installer
RUN curl -O https://beta.quicklisp.org/quicklisp.lisp
# Installs quicklisp and radiance
RUN sbcl --eval "(load \"quicklisp.lisp\")" \
--eval "(quicklisp-quickstart:install)" \
--eval "(ql-dist:install-dist \"http://dist.shirakumo.org/shirakumo.txt\" :prompt nil)" \
--eval "(ql:quickload :radiance)"
# Makes the project workdir known as a quicklisp project
RUN mkdir -p $HOME/.config/common-lisp/source-registry.conf.d
RUN echo '(:tree "/app/")' >> "$HOME/.config/common-lisp/source-registry.conf.d/projects.conf"
# Builds Asteroid binary
RUN make
# Links binary to path
ENV PATH="$PATH:/app"
# Adds radiance system configuration file
COPY docker/radiance-default.conf.lisp $HOME/.config/radiance/default/radiance-core/radiance-core.conf.lisp
# Application
EXPOSE 8080
# Slynk server
EXPOSE 4009
ENV ASTEROID_STREAM_URL=http://localhost:8000
CMD [ "asteroid" ]

View File

@ -0,0 +1,14 @@
services:
asteroid:
build:
context: ../
dockerfile: Dockerfile.asteroid
image: asteroid/app
container_name: asteroid
environment:
- ASTEROID_STREAM_URL=${ASTEROID_STREAM_URL:-http://localhost:8000}
volumes:
- ${MUSIC_LIBRARY:-../music/library}:/app/music/library:ro
- ${QUEUE_PLAYLIST:-../stream-queue.m3u}:/app/stream-queue.m3u
network_mode: host
restart: unless-stopped

View File

@ -24,9 +24,9 @@ services:
depends_on:
- icecast
volumes:
- ../music/library:/app/music:ro
- ${MUSIC_LIBRARY:-../music/library}:/app/music:ro
- ./asteroid-radio-docker.liq:/app/asteroid-radio.liq:ro
- ../stream-queue.m3u:/app/stream-queue.m3u:ro
- ${QUEUE_PLAYLIST:-../stream-queue.m3u}:/app/stream-queue.m3u:ro
restart: unless-stopped
networks:
- asteroid-network

View File

@ -0,0 +1,20 @@
; meta (:version 1.0 :package "RADIANCE-CORE")
((:interfaces (:admin . "r-simple-admin") (:auth . "r-simple-auth")
(:ban . "r-simple-ban") (:cache . "r-simple-cache")
(:data-model . "r-simple-model") (:database . "i-lambdalite")
(:relational-database . "i-sqlite") (:logger . "i-verbose")
(:mail . "i-smtp") (:profile . "r-simple-profile") (:rate . "r-simple-rate")
(:server . "i-hunchentoot") (:session . "r-simple-sessions")
(:user . "r-simple-users"))
(:versions
. [hash-table equal ("radiance-core" :|2.2.0|) ("i-hunchentoot" :|1.1.0|)
("asteroid" :|0.0.0|) ("i-log4cl" :|1.0.0|) ("r-clip" :|1.0.0|)
("r-data-model" :|1.0.1|) ("i-lambdalite" :|1.0.0|)
("r-simple-users" :|1.0.1|)
("r-simple-errors" :|1.0.0|) ("i-verbose" :|1.0.0|)
("r-simple-auth" :|1.0.0|) ("r-simple-sessions" :|1.0.1|)
("r-ratify" :|1.0.0|) ("r-simple-rate" :|1.0.0|)
("r-simple-profile" :|1.0.0|)])
(:domains "radiance" "localhost")
(:startup :r-simple-errors :r-simple-sessions) (:routes)
(:debugger . :if-swank-connected))

View File

@ -380,7 +380,11 @@ sudo systemctl reload nginx
* Docker Management
** Container Management
** Stream Services
The stream services can be managed using docker from inside the =docker= folder on this repository.
*** Container Management
#+BEGIN_SRC bash
# Start services
docker compose up -d
@ -395,11 +399,42 @@ docker compose logs -f
docker compose restart
#+END_SRC
** Docker Configuration
*** Docker Configuration
See =docker/docker-compose.yml= for complete Docker setup with Icecast2 and Liquidsoap containers. The setup includes:
- **Icecast2**: Streaming server with three output formats
- **Liquidsoap**: Audio processing and stream generation
- **Music Volume**: Mounted from =./music/= directory
- **Music Volume**: Mounted to the =./music/library= directory (can also be set with the =MUSIC_LIBRARY= environment variable)
- *Queue Playlist*: Mounted to the =./stream-queue.m3u= file (can also be set with the =QUEUE_PLAYLIST= environment variable)
** Asteroid Radio Application
The asteroid radio application can also be served and managed using docker from inside the =docker= folder on this repository.
*** Container Management
#+BEGIN_SRC bash
# Build service
docker compose -f docker-compose.asteroid.yml build
# Start service
docker compose -f docker-compose.asteroid.yml up -d
# Stop service
docker compose -f docker-compose.asteroid.yml down
# View logs
docker compose -f docker-compose.asteroid.yml logs -f
# Restart service
docker compose -f docker-compose.asteroid.yml restart
#+END_SRC
*** Docker Configuration
See =docker/docker-compose.asteroid.yml= for complete Docker setup, which includes:
- Buils the application using the current cloned branch for the repository
- Uses the host network for easy access to the stream endpoint
- *Stream endpoint* mapped to =http://localhost:8000= (can also be set with the =ASTEROID_STREAM_URL= environment variable)
- **Music Volume**: Mounted to the =./music/library= directory (can also be set with the =MUSIC_LIBRARY= environment variable)
- *Queue Playlist*: Mounted to the =./stream-queue.m3u= file (can also be set with the =QUEUE_PLAYLIST= environment variable)
* Initial Configuration

View File

@ -282,12 +282,15 @@
;; Fallback to delayed initialization
(bt:make-thread
(lambda ()
(sleep 3) ; Give database more time to initialize
(dotimes (a 5)
(unless (db:connected-p)
(sleep 3)) ; Give database more time to initialize
(handler-case
(progn
(format t "Retrying user management setup...~%")
(create-default-admin)
(format t "User management initialization complete.~%"))
(format t "User management initialization complete.~%")
(return))
(error (e)
(format t "Error initializing user system: ~a~%" e))))
(format t "Error initializing user system: ~a~%" e)))))
:name "user-init"))))