diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..62a782f --- /dev/null +++ b/Dockerfile @@ -0,0 +1,40 @@ +FROM node:21-alpine +ARG GIT_REPO=https://github.com/iptv-org/epg.git +ARG GIT_BRANCH=master +ENV CRON_SCHEDULE="0 0,12 * * *" +ENV DAYS=14 +ENV MAX_CONNECTIONS=10 +ARG BIN_FOLDER=/bin +ARG EPG_FOLDER=epg +ARG START_SCRIPT_ARG=$BIN_FOLDER/$EPG_FOLDER/start.sh +ENV WORKDIR=${BIN_FOLDER}/${EPG_FOLDER} +ENV START_SCRIPT=$START_SCRIPT_ARG +COPY channels.xml /config/channels.xml +RUN apk update \ + && apk upgrade --available \ + && apk add curl \ + && apk add git \ + && apk add tzdata \ + && apk add bash \ + && npm install -g npm@latest \ + && npm install pm2 -g \ + && mkdir $(echo "${BIN_FOLDER}/${EPG_FOLDER}") -p \ + && git -C $(echo "${BIN_FOLDER}") clone --depth 1 -b $(echo "${GIT_BRANCH} ${GIT_REPO}") \ + && cd $WORKDIR cat && npm install && npm update \ + && rm .eslintrc.json \ + && rm -rf .github \ + && rm -rf .git \ + && rm .gitignore \ + && rm CONTRIBUTING.md \ + && rm LICENSE \ + && rm README.md \ + && rm SITES.md \ + && ln -s /config/channels.xml $(echo "${WORKDIR}/channels.xml") \ + && mkdir /public +COPY start.sh $WORKDIR +COPY serve.json $WORKDIR +RUN chmod +x "$START_SCRIPT" \ + && apk del git curl \ + && rm -rf /var/cache/apk/* +ENTRYPOINT bash $START_SCRIPT chron-schedule="$CRON_SCHEDULE" work-dir="$WORKDIR" days="$DAYS" max_connections="$MAX_CONNECTIONS" +EXPOSE 3000 \ No newline at end of file diff --git a/README.md b/README.md index e33c1e1..efbd5af 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,27 @@ # epg-info-docker -This repo builds and Dokcer image of [iptv-org/epg](https://github.com/iptv-org/epg) +This repo builds and Docker image of [iptv-org/epg](https://github.com/iptv-org/epg). +The purpose is to make the deployment easier and more suitable for different environments. + + +## Dependencies +[Node](https://nodejs.org/en)
+[pm2](https://www.npmjs.com/package/pm2)
+[serve](https://www.npmjs.com/package/serve)
+ +## Docker image + +### Paths + +An example `channels.xml` is included by default in the image. +However if you want to configure your own channels you need to provide your own configuration file. +You can do this by creating a mapping in the `/config` folder. + +### Environment Variables + +| Variable | Description | Default | +|-------------------------------|----------------------------------------------------------------------------|------------------| +| CRON_SCHEDULE | CRON expression describing the recurrence for epg retrieval. | 0 0,12 * * * | +| DAYS | Describes the desired amount of days in the future for for epg retrieval. | 14 | +| MAX_CONNECTIONS | The maximum amount of parallel connections that can be established | 10 | diff --git a/channels.xml b/channels.xml new file mode 100644 index 0000000..2f4c8bd --- /dev/null +++ b/channels.xml @@ -0,0 +1,5 @@ + + + + 24 Horas + \ No newline at end of file diff --git a/serve.json b/serve.json new file mode 100644 index 0000000..aeaa882 --- /dev/null +++ b/serve.json @@ -0,0 +1,4 @@ +{ + "symlinks": true, + "public": "/public" +} \ No newline at end of file diff --git a/start.sh b/start.sh new file mode 100644 index 0000000..831aa5d --- /dev/null +++ b/start.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# Loop through arguments +for arg in "$@"; do + case "$arg" in + chron-schedule=*) chron_schedule="${arg#*=}" ;; + work-dir=*) work_dir="${arg#*=}" ;; + days=*) days="${arg#*=}" ;; + max_connections=*) max_connections="${arg#*=}" ;; + esac +done + +echo "chron_schedule : ${chron_schedule}" +cd $work_dir +echo "working dir : " $(pwd) +echo "days : ${days}" +echo "max_connections : ${max_connections}" + +pm2 --name epg start npm -- run serve +npm run grab -- --channels=channels.xml --maxConnections=$max_connections --days=$days --gzip +ln -s $work_dir/guide.xml /public/guide.xml +ln -s $work_dir/guide.xml.gz /public/guide.xml.gz +npm run grab -- --channels=channels.xml --cron="$chron_schedule" --maxConnections=$max_connections --days=$days --gzip \ No newline at end of file