Skip to content

Commit

Permalink
[K8sBroadcaster] Move and simplify Broadcaster
Browse files Browse the repository at this point in the history
  • Loading branch information
mickel8 committed Dec 16, 2024
1 parent c916871 commit 3b6f703
Show file tree
Hide file tree
Showing 33 changed files with 2,749 additions and 288 deletions.
53 changes: 53 additions & 0 deletions .github/workflows/k8s_broadcaster_cd.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
name: K8sBroadcaster CD

on:
push:
tags:
- "v*.*.*"

permissions:
contents: read
packages: write

env:
REGISTRY: ghcr.io
APP_NAME: k8s_broadcaster

jobs:
build-publish-image:
name: "Build and publish image"
runs-on: ubuntu-latest
steps:
- name: Checkout the code
uses: actions/checkout@v4
with:
sparse-checkout: ${{ env.APP_NAME }}

- name: Set up Docker Buildx
uses: docker/setup-buildx-action@v2

- name: Login to Container Registry
uses: docker/login-action@v2
with:
registry: ${{ env.REGISTRY }}
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}

- name: Extract metadata (tags, labels) for Docker
id: meta
uses: docker/metadata-action@v4
with:
images: ${{ env.REGISTRY }}/${{ github.repository }}/${{ env.APP_NAME }}
tags: type=match,pattern=${{ env.APP_NAME }}-v(.*),group=1

- name: Build and push Docker image
uses: docker/build-push-action@v4
with:
context: ./${{ env.APP_NAME }}
platforms: linux/amd64
push: true
tags: ${{ steps.meta.outputs.tags }}
cache-from: type=gha
cache-to: type=gha,mode=max


Empty file.
105 changes: 105 additions & 0 deletions k8s_broadcaster/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,105 @@
# Find eligible builder and runner images on Docker Hub. We use Ubuntu/Debian
# instead of Alpine to avoid DNS resolution issues in production.
#
# https://hub.docker.com/r/hexpm/elixir/tags?page=1&name=ubuntu
# https://hub.docker.com/_/ubuntu?tab=tags
#
# This file is based on these images:
#
# - https://hub.docker.com/r/hexpm/elixir/tags - for the build image
# - https://hub.docker.com/_/debian?tab=tags&page=1&name=bullseye-20231009-slim - for the release image
# - https://pkgs.org/ - resource for finding needed packages
# - Ex: hexpm/elixir:1.16.0-erlang-26.2.1-debian-bullseye-20231009-slim
#
ARG ELIXIR_VERSION=1.17.2
ARG OTP_VERSION=27.0.1
ARG DEBIAN_VERSION=bookworm-20240701-slim

ARG BUILDER_IMAGE="hexpm/elixir:${ELIXIR_VERSION}-erlang-${OTP_VERSION}-debian-${DEBIAN_VERSION}"
ARG RUNNER_IMAGE="debian:${DEBIAN_VERSION}"

FROM ${BUILDER_IMAGE} AS builder

ARG TARGETPLATFORM
RUN echo "Building for $TARGETPLATFORM"

# install build dependencies
RUN apt-get update -y && apt-get install -y build-essential git pkg-config libssl-dev
# ex_srtp doesn't include precompiled libsrtp2 for ARM64 linux
RUN if [ "$TARGETPLATFORM" = "linux/arm64" ]; then apt-get install -y libsrtp2-dev; fi
RUN apt-get clean && rm -f /var/lib/apt/lists/*_*

# prepare build dir
WORKDIR /app

# install hex + rebar
RUN mix local.hex --force && \
mix local.rebar --force

# set build ENV
ENV MIX_ENV="prod"

# install mix dependencies
COPY mix.exs mix.lock ./
RUN mix deps.get --only $MIX_ENV
RUN mkdir config

# copy compile-time config files before we compile dependencies
# to ensure any relevant config change will trigger the dependencies
# to be re-compiled.
COPY config/config.exs config/${MIX_ENV}.exs config/
RUN mix deps.compile

COPY priv priv

COPY lib lib

COPY assets assets

# compile assets
RUN mix assets.deploy

# Compile the release
RUN mix compile

# Changes to config/runtime.exs don't require recompiling the code
COPY config/runtime.exs config/

COPY rel rel
RUN mix release

# start a new build stage so that the final image will only contain
# the compiled release and other runtime necessities
FROM ${RUNNER_IMAGE}

ARG TARGETPLATFORM
RUN echo "Building for $TARGETPLATFORM"

RUN apt-get update -y && apt-get install -y libstdc++6 openssl libncurses5 locales ca-certificates
RUN if [ "$TARGETPLATFORM" = "linux/arm64" ]; then apt-get install -y libsrtp2-dev; fi
RUN apt-get clean && rm -f /var/lib/apt/lists/*_*

# Set the locale
RUN sed -i '/en_US.UTF-8/s/^# //g' /etc/locale.gen && locale-gen

ENV LANG=en_US.UTF-8
ENV LANGUAGE=en_US:en
ENV LC_ALL=en_US.UTF-8

WORKDIR "/app"
RUN chown nobody /app

# set runner ENV
ENV MIX_ENV="prod"

# Only copy the final release from the build stage
COPY --from=builder --chown=nobody:root /app/_build/${MIX_ENV}/rel/k8s_broadcaster ./

USER nobody

# If using an environment that doesn't automatically reap zombie processes, it is
# advised to add an init process such as tini via `apt-get install`
# above and adding an entrypoint. See https://github.com/krallin/tini for details
# ENTRYPOINT ["/tini", "--"]

CMD ["/app/bin/server"]
20 changes: 20 additions & 0 deletions k8s_broadcaster/assets/css/app.css
Original file line number Diff line number Diff line change
Expand Up @@ -3,3 +3,23 @@
@import "tailwindcss/utilities";

/* This file is for your main application CSS */

::-webkit-scrollbar {
display: none;
}

.details {
padding: 5px 0px;
}

summary {
color: #0d0d0d;
align-items: center;
padding-bottom: 5px;
justify-content: space-between;
}

.summary-content {
color: #606060;
padding: 5px 0px;
}
37 changes: 23 additions & 14 deletions k8s_broadcaster/assets/js/app.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,29 +16,38 @@
//

// Include phoenix_html to handle method=PUT/DELETE in forms and buttons.
import "phoenix_html"
import 'phoenix_html';
// Establish Phoenix Socket and LiveView configuration.
import {Socket} from "phoenix"
import {LiveSocket} from "phoenix_live_view"
import topbar from "../vendor/topbar"
import { Socket } from 'phoenix';
import { LiveSocket } from 'phoenix_live_view';
import topbar from '../vendor/topbar';

let csrfToken = document.querySelector("meta[name='csrf-token']").getAttribute("content")
let liveSocket = new LiveSocket("/live", Socket, {
import { Home } from './home.js';
import { Panel } from './panel.js';

let Hooks = {};
Hooks.Home = Home;
Hooks.Panel = Panel;

let csrfToken = document
.querySelector("meta[name='csrf-token']")
.getAttribute('content');
let liveSocket = new LiveSocket('/live', Socket, {
longPollFallbackMs: 2500,
params: {_csrf_token: csrfToken}
})
params: { _csrf_token: csrfToken },
hooks: Hooks,
});

// Show progress bar on live navigation and form submits
topbar.config({barColors: {0: "#29d"}, shadowColor: "rgba(0, 0, 0, .3)"})
window.addEventListener("phx:page-loading-start", _info => topbar.show(300))
window.addEventListener("phx:page-loading-stop", _info => topbar.hide())
topbar.config({ barColors: { 0: '#29d' }, shadowColor: 'rgba(0, 0, 0, .3)' });
window.addEventListener('phx:page-loading-start', (_info) => topbar.show(300));
window.addEventListener('phx:page-loading-stop', (_info) => topbar.hide());

// connect if there are any LiveViews on the page
liveSocket.connect()
liveSocket.connect();

// expose liveSocket on window for web console debug logs and latency simulation:
// >> liveSocket.enableDebug()
// >> liveSocket.enableLatencySim(1000) // enabled for duration of browser session
// >> liveSocket.disableLatencySim()
window.liveSocket = liveSocket

window.liveSocket = liveSocket;
Loading

0 comments on commit 3b6f703

Please sign in to comment.