Watch
0
0
Fork
You've already forked c3voc-docs
0

Compare commits

..
Author SHA1 Message Date
bc8def927d WIP FIXUP: Fix staging domain and folder
TODO: target host is not publicly reachable!
2026-04-06 21:55:56 +02:00
f478e1c114 feat(ci): Add deployment to static web host 2026-04-06 21:02:45 +02:00
26 changed files with 130 additions and 392 deletions

View file

@ -0,0 +1,29 @@
on:
pull_request:
types:
- closed
env:
TZ: Europe/Berlin
DEPLOY_TARGET_BASE: c3vocdocs-website-deploy@public-web-static-intern.hamburg.ccc.de
STAGING_BASE_PATH: https://staging.docs.c3voc.de/av
STAGING_DEPLOY_PATH: /var/www/staging.docs.c3voc.de/av/
jobs:
cleanup-staging:
runs-on: ubuntu-latest
container:
image: code.forgejo.org/oci/node:22-bookworm
steps:
- name: Pipeline info PR
run: |
echo "Run triggered by ${{ github.event_name }} (${{ github.event.action }}) on ref ${{ github.ref_name }}"
- name: Staging Deployment - Prepare keys
run: |
echo "${{ secrets.SSH_DEPLOY_KEY }}" > deploykey.priv
chmod 400 deploykey.priv
echo "${{ secrets.SSH_KNOWN_HOSTS_FILE }}" > ./known_hosts
- name: Staging Deployment - Remove PR from staging
run: |
ssh -i deploykey.priv -o 'UserKnownHostsFile ./known_hosts' ${{ env.DEPLOY_TARGET_BASE }} -t "rm -r ${{ env.STAGING_DEPLOY_PATH }}/pr${{ github.event.pull_request.number }}/"

View file

@ -0,0 +1,80 @@
on:
push:
branches:
- main
pull_request:
env:
TZ: Europe/Berlin
DEPLOY_TARGET_BASE: c3vocdocs-website-deploy@public-web-static-intern.hamburg.ccc.de
PROD_BASE_PATH: https://docs.c3voc.de/av
PROD_DEPLOY_PATH: /var/www/docs.c3voc.de/av/
STAGING_BASE_PATH: https://staging.docs.c3voc.de/av
STAGING_DEPLOY_PATH: /var/www/staging.docs.c3voc.de/av/
jobs:
build:
runs-on: ubuntu-latest
container:
image: python:3.13-trixie
steps:
- name: Pipeline info
run: |
echo "Run triggered by ${{ github.event_name }} (${{ github.event.action }}) on ref ${{ github.ref_name }}"
- name: Bootstrap CI Tools
run: |
apt update
apt -y install nodejs git rsync openssh-client
pip install --upgrade pip
- uses: actions/checkout@v6
with:
fetch-depth: 0 # pull full history for page lastmod by git commit date
- name: Install Python packages
run: |
pip install -r requirements.txt
- name: Build website - prod
run: |
mkdocs build
- name: Build website - staging
if: github.ref_name != 'main'
run: |
sed -i "s#site_url: ${{ env.PROD_BASE_PATH }}/'#site_url: ${{ env.STAGING_BASE_PATH }}/pr${{ github.event.pull_request.number }}/#" mkdocs.yml
mkdocs build
- name: Deploy - Prepare keys
if: github.event_name == 'push' || github.event_name == 'pull_request' || github.event_name == 'schedule'
run: |
echo "${{ secrets.SSH_DEPLOY_KEY }}" > deploykey.priv
chmod 400 deploykey.priv
echo "${{ secrets.SSH_KNOWN_HOSTS_FILE }}" > ./known_hosts
- name: Deploy - Upload PR to staging
if: github.event_name == 'pull_request'
run: |
echo "Deploying to ${{ env.STAGING_BASE_PATH }}/pr${{ github.event.pull_request.number }}"
rsync -v -r --delete -e "ssh -i deploykey.priv -o 'UserKnownHostsFile ./known_hosts'" site/ ${{ env.DEPLOY_TARGET_BASE }}:${{ env.STAGING_DEPLOY_PATH }}/pr${{ github.event.pull_request.number }}/
- name: Deploy - Add comment to PR with staging URL
if: github.event_name == 'pull_request' && github.event.action == 'opened'
run: |
curl \
-X POST \
${{ github.event.pull_request.base.repo.url }}/issues/${{ github.event.pull_request.number }}/comments \
-H "Content-Type: application/json" \
-H "Authorization: token $GITHUB_TOKEN" \
--data '{ "body": "You can view your changes at ${{ env.STAGING_BASE_PATH }}/pr${{ github.event.pull_request.number }}/" }'
- name: Deploy - Upload to prod
if: (github.event_name == 'push' || github.event_name == 'schedule') && github.ref_name == 'main'
run: |
rsync -v -r --delete -e "ssh -i deploykey.priv -o 'UserKnownHostsFile ./known_hosts'" site/ ${{ env.DEPLOY_TARGET_BASE }}:${{ env.PROD_DEPLOY_PATH }}
- uses: actions/upload-artifact@v3
if: github.event_name == 'pull_request'
with:
name: website-build
path: public/

2
.gitignore vendored
View file

@ -1,4 +1,2 @@
/site
orig/
.venv/
venv/

View file

@ -1,95 +0,0 @@
---
title: Camera Configuration
---
## Video Settings
We're recording at 1920x1080 pixels with 25 fps.
The lowest bitrate should be enough (XAVC S, S-L420, Low/ 16M).
We also use proxy recording since it can upload "continously" on a storage server via FTP.
For the proxies we use the highest available quality (1920p, 16M, 2min chunks).
## Audio Settings
The camera supports up to 4 audio channels.
The two XLR inputs are assigned to channel 1 and 2 while channel 3 and 4 are used with the internal mic with auto-gain.
In conjunction with the [settings of the audio mixer](./foh-module.md#audio-mixer), an **"Audio Input Level" of 89** is known to not clip even with 0 dB output of the audio mixer.
**Thereofore the audio dials on the side of the camera are deactivated now.**
## Lecture Mode Hinting
The monitoring video output is configured in a way that the invisible part in lecture mode is slightly grayed out.
We use a custom aspect ratio display of 9 to 14 for that.
## FTP Upload
Each camera shall upload to the minion of the same hall setup.
Therfore "File Transfer" auto-upload is enabled and set to "Chunk" upload of the proxies.
The server setting is set to `minionX.lan.c3voc.de`, port 21, username `saalX-sony`.
## Full Config
All required settings:
- User -> Peaking
* On
* Level: Mid
* Color: Yellow
- Shooting -> ISO/Gain:
* Mode: db
* L/M/H: 0/6/12 dB
* Shockless Gain: On
- Project -> Rec Format
* Frequency: 25
* Codec Category: XAVC S
* Codec: S-L420
* Video Format: 1920p
* Quality: Low
* Bit Rate: 16M
- Project -> Proxy Rec
* Setting: On
* Proxy Format: 1920p 16
* Audio Channel: CH1/CH2
* Chunk: 2min
- Monitoring -> Output on/off
* SDI: on
* HDMI: on
- Monitoring -> Output Format
* SDI: on
* HDMI: on
- Monitoring -> Output Display
* SDI: **off**
* HDMI: on
- Monitoring -> Marker
* Setting: on
* Color: white
* Center Marker: Off
* Safety Zone: Off
* Asepct Marker: Mask
* Aspect Mask: 7
* Aspect Safety Zone: Off
* Aspect Select: Custom
* Custom Aspect Ratio: 09.00:14.00
- Audio -> Audio Input:
* CH1 Input Select: INPUT1
* CH2 Input Select: INPUT2
* CH3 Input Select: Internal Mic
* CH4 Input Select: Internal Mic
* Line Input Reference: -3dB
* CH3 Level Control: Auto
* CH4 Level Control: Auto
* CH3 Input Level: 49
* CH4 Input Level: 49
* Audio Input Level: **89**
* CH1 Level: Audio Input Level
* CH2 Level: Audio Input Level
* CH3 Level: CH3 Input Level
* CH4 Level: CH4 Input Level
- Network -> File Transfer:
* Auto Upload: On
* Auto Upload (Proxy): Chunk
* Default Uplaod Server: minionX
* Server Settings1:
* Display Name: minionX
* Service: FTP
* Host Name: minionX.lan.c3voc.de
* Port: 21
* User Name: saalX-sony
* Passive Mode: Off

View file

@ -1,143 +0,0 @@
---
title: FOH Module
---
## Audio Mixer
The Case 2.0 uses an Allen & Heath CQ-18T audio mixer because it's compact and has all important features we need, especially an automatic microphone mixer (AMM).
It takes all four microphones, the speaker laptop's audio, and optionally a remote participant's audio and outputs a signal to the room's loudspeakers (PA), a signal for the recording, and optionally an "n-1 mix" for the remote participant(s).
A config backup can be found [here](./configs/AHCQ-default-20261106.zip).
### Basic Signal Routing
As mentioned before, we need to produce two main audio mixes: The recording mix and the room PA.
Those two are basically the same signal, but we want to have the opportunity to add additional EQ to the PA and have additional compression on the recording mix.
Therefore we need two separate mixes and can't just "clone" the main mix for both.
The remote participant output is the same as the main/ recording mix, but without the input from the remote participant itself.
Otherwise we would have built a feedback loop.
### Inputs and Outputs
We're mainly using input 1-8 for our needs:
- Input 1 and 2: Wireless headsets microphones
- Input 3 and 4: Wireless handheld microphones
- Input 5 and 6: Laptop audio
- Input 7 and 8: Remote participant audio
- ST IN
- USB
- BT
Outputs:
- Main Mix/ Main L+R
- Out 5+6: Recording Mix
- Out 3: n-1 Mix
- Out 4: Unused
- Out 1+2: Unused
### Routing (Sends)
- Everything goes to the PA
- The "Recording Mix" is all post-fader
- The "n-1 Mix" is all post-fader
* but the "remote participant input" is disabled/ pulled to `-infinity`
We're using post-fader sends since we're only using the different mixes to remove some channels from a mix completely or to change the EQ and dynamics of the mix output.
But we don't want different levels of the inputs in each mix (which would also make mixing a lot more complicated).
So we're adjusting the input channel levels on the main mix and reuse them for the recording and "n-1" mixes.
Note: Unfortunately it's not possible with the CQ-18T to disable a channel on the main mix only.
If you really need to have something in the recording, but not on the PA, you should put the PA on a different output than Main output.
(Otherwise you would need to use some pre-fader sends which is quite error-prone in our use case.)
### Input Settings and Processing
#### Microphone Channels
The microphone inputs use:
- Some EQ to adjust for the microphone characteristic, remove handling noise (low frequencies) and remove some harsh s-sounds (high frequencies)
- Some decent compression to even out the speaker's volume and reduce plosives
- No gate since it just sounds weird without atmo microphones and we have the AMM for "gating out" microphones without speech
- Auto-gain shall not be used since it creates more issues than it solves in practice
![](img/cq18t-in-mic1-eq.jpg)
This is only an example, different microphones (headset vs. handheld) need different EQ settings.
The green area on the left shows the low pass filter which can be set at the input/ source settings page.
![](img/cq18t-in-mic1-compressor.jpg)
The gain of the compressor it set in a way, that an input level of 0 dB lands at an output level of 0 dB (yellow line intersects the crosspoint of the two zero lines).
#### Laptop Channel
The laptop channel uses:
- No EQ, since this is not a microphone needing adjustment
- Some slight compression to even out different input levels without much manual adjustment
- Ratio 4:1, Threshold -12 dB, Gain 7 dB, 300us attack, 250ms release
- A gate to mute the channel when no signal or just some low-level noise is present (fallback when the channel isn't muted)
- Threshold -30 dB, Depth 20 dB, 150 us attack, 500 ms hold, 1s release
- No Auto-Gain, since the maximum level is known beforehand
#### Digital Inputs
The whole signal chain on the CQ18-T is designed in a way that everything should be at the 0 dB level, but there's still 12 dB headroom left up to the "full scale" digital signal.
But digital input signals don't really need additional headroom in the input since the maximum signal is strictly specified by the digital values.
So those inputs will produce a +12 dB signal when fed with a maximum volume input.
To keep the digital inputs (like Bluetooth and USB) at a comparable level to the analog inputs, each digital input shall be configured to a -12 dB input gain/ trim. Otherwise they'll be way too loud.
### Output Settings and Processing
#### Main Mix
The main mix does not use additional compression, but some EQ and feedback assist can be used as needed to remove excessive reverb at certain frequencies as well as feedback frequencies.
#### Recording Mix
The recording mix uses no additional EQ, but some more compression to level out the volume swings of natural speech even more.
![](img/cq18t-out-recording-compressor.jpg)
The gain of the compressor it set in a way, that an input level of 0 dB lands at an output level of 0 dB (yellow line intersects the crosspoint of the two zero lines).
We also apply some limiter at +3 dB with fast attack to prohibit clipping the camera input.
![](img/cq18t-out-recording-limiter.jpg)
Note: With this setting and the camera inputs set to 100% digital input level and the dial set to 7, the camera inputs should not clip!
Alternately you can set the dials to 10 and the digital input level to 89.
### AMM
**The auto mic mixer (AMM) should always be used!**
From our experience the AMM works really well and produces way better sound than what you can do by muting and un-muting microphones all the time -- especially in a Q&A situation.
The AMM is enabled in all microphone channels (inputs 1-4) and "follow fader" shall be enabled.
(Without "follow fader" the AMM will still use the input of microphones which are pulled down using the fader. This may lead to unexpected results.)
### Buttons
The canonical configuration should have the following layout:
- Left side (rotaries):
* channel gain (or smart rotary)
* headphone 1 volume (or smart rotary)
* headphone 2 volume (or smart rotary)
- Right side (buttons):
* Enable/ disable smart rotaries (changes what the rotary knobs are doing)
* Channel mute (for selected channel)
* stream mix PAFL (or AMM in old config)
## Audio De-Embedder
The SDI audio de-embedder is used to extract the speaker laptop's audio from the "slides" SDI signal so that it's available in the audio mixer.
This way we can:
- inject the laptop audio to the loudspeakers in the room
- adjust the audio level at a unified place (the audio mixer)
## Wireless Microphones
- The beltbacks have +3 dB of gain at the transmitter
- The handheld microphones have 0 dB of gain at the transmitter

Binary file not shown.

Before

Width:  |  Height:  |  Size: 234 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 81 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 458 KiB

View file

@ -1,16 +0,0 @@
---
title: Overview
order: 0
---
This section shall explain the configuration of the devices in the Case 2.0 setup to:
1. Document the settings when a replacement device is needed
2. Explain why the settings were chosen
Notable devices are:
- [ATEM Mini](./lectern-module.md#atem-mini)
- [Audio Mixer](./foh-module.md#audio-mixer)
- [Audio De-Embedder](./foh-module.md#audio-de-embedder)
- [Camera](./camera.md)

View file

@ -1,47 +0,0 @@
---
title: Lectern Module
---
The Lectern Module contains an ATEM Mini as seamless switcher, an [Infobeamer](https://info-beamer.com/) Raspberry Pi, an HDMI splitter, a Blackmagic UpDownCross converter as HDMI to SDI converter and a network switch.
This page will go into the details how the individual devices are configured.
## ATEM Mini
The ATEM Mini will mainly be configured by the [pygtk-atem-switcher](https://github.com/kunsi/pygtk-atem-switcher) which is installed on the mixer laptop and configured by the [VOC config management](https://forgejo.c3voc.de/voc/cm).
It will configure the following things when it's started:
- Input names
- Output resulution and framerate (note: The ATEM Mini will reset itself to 1080p60 when it looses power)
Not auto-configured are:
- Still images
- Audio levels of the HDMI inputs
- Audio levels and muting of the 3.5mm stereo-jack inputs
- Configuring the 3.5mm jacks to "line" level (instead of microphone)
Manual default configuration:
- Turn audio on input 1 (speaker's laptop) on and reset level ("reset" button)
- Turn "MIC 1" (and "MIC 2") 3.5mm jacks off
- Set analog level to 0 dB gain and 0 dB level (only possible using software control UI)
![](img/lectern-audio-comp.jpeg)
## UpDownCross
The VOC records in 1080x1920px at 25fps, so all input signals to the recording shall also be at this resolution and frame rate.
However, some projectors or displays don't like 25fps, so we set the output of the ATEM Mini to 50fps and use the Blackmagic UpDownCross for the framerate conversion as well as converting the signal from HDMI to SDI.
The DIP switches should be set to 1080p25.
![](img/bmd-udc.jpeg)
## Infobeamer
The Raspberry Pi is configured with the [Infobeamer](https://info-beamer.com/) SD card image and registered at the VOC account.
Additional settings are:
- Static IP (`10.73.x.4/16`, according to case number)
- Router at `10.73.0.254`

View file

@ -2,83 +2,30 @@
title: Cabling
---
Please also see the [Buildup Plan](buildup.md) for detailed instructions and what to consider when setting up a lecture room.
The 2 main components of the lecture hall setup are the lectern module on the stage and the FOH module and camera at some "front of house" location.
They are connected by: 1 SDI cable and 1 ethernet cable.
Depending on the location of the audio inputs to the hall, one or two XLR cables may also be laid to the stage or some other location in the hall.
Considerations regarding network connection can be found in the [Network Setup](#network-setup) chapter.
This cabling diagram contains all connections between modules and devices (but not the inner workings of the modules): ![](img/voc-case2_0-cabling.png)
Note: This cabling diagram doesn't show the option to connect lectern and FOH modules via fiber yet.
## Network Setup
A VOC lecture hall setup needs some internal VOC network (commonly named VOC-VLAN, even though it may not always be a VLAN technically) and a way to have internet access.
Depending on the number of rooms and the network provided by the location or event there are multiple ways to connect rooms.
This needs to be designed by the VOC responsible person.
The easiest setup is a single room (or multiple fully independent rooms).
Since the Lectern and FOH modules both have network ports for public and VOC network and a VLAN trunk between them, it doesn't matter where the public network is connected.
### Recommended Single-Room Network Setup
- Put the WRT router near the FOH module
- If the room's public network (uplink) is located at the stage:
* Connect the public network (uplink) to the "public" port of the lectern module
* Connect the WAN port of the WRT to some "public" port of the FOH module's network switch
- If the room's public network (uplink) is located near the FOH:
* Connect the WAN port of the WRT to the public network (uplink)
- Connect one LAN port of the WRT to some "VOC" port of the FOH module's network switch
- Power on the WRT router
See <https://c3voc.de/wiki/hardware:wrts> how to enable DHCP in the VOC-(V)LAN if needed.
### Multi-Room Network Setup
Ideally there's a private VLAN between all rooms which can be used to interconnect all room setups and the office.
In that case, each hall setup just needs to be connected to the venue VLAN with one "VOC" port (either at the lectern or at the FOH module -- whatever is more convenient).
When the server case is used, the router VM will provide uplink to the whole VOC network.
If not, deploy one WRT router in a lecture hall or the VOC office providing a connection between public and VOC network.
(Remember to enable all hall networks which are reachable via this router so that the remote access VPN works. TODO: Where is this documented?)
## Fiber between FOH and Lectern
We prepared the option to use a fiber run between lectern and FOH module in 2026-11 (but the fiber is not available yet).
Both sides use E2000/ LSH connectors, but you can also unplug the patch cables from the switch and SDI fiber converters and plug in a twin fiber with LC connectors instead.
Both sides use fiber core A for SDI and fiber core B for the network trunk.
Both links use bi-directional optics for the links, so that we only need a twin fiber for both connections.
- The SDI link uses a 1270/1330&nbsp;nm (lavender) SFP module for on the lectern side and TODO (blue) on the FOH side
- The network link uses a 1330/1270&nbsp;nm (blue) SFP module for on the lectern side and TODO (lavender) on the FOH side
Simplified cabling diagram: ![](img/voc-case2_0-cabling.png)
## FOH Module
![](img/voc-case2_0-foh-back.jpeg)
See the netbox for detailed port configuration:
[Case 1](https://netbox.c3voc.de/dcim/devices/19/interfaces/),
[Case 2](https://netbox.c3voc.de/dcim/devices/25/interfaces/),
[Case 3](https://netbox.c3voc.de/dcim/devices/26/interfaces/),
[Case 4](https://netbox.c3voc.de/dcim/devices/27/interfaces/),
[Case 5](https://netbox.c3voc.de/dcim/devices/28/interfaces/),
[Case 6](https://netbox.c3voc.de/dcim/devices/29/interfaces/)
- [Case 1](https://netbox.c3voc.de/dcim/devices/19/interfaces/)
- [Case 2](https://netbox.c3voc.de/dcim/devices/25/interfaces/)
- [Case 3](https://netbox.c3voc.de/dcim/devices/26/interfaces/)
- [Case 4](https://netbox.c3voc.de/dcim/devices/27/interfaces/)
- [Case 5](https://netbox.c3voc.de/dcim/devices/28/interfaces/)
- [Case 6](https://netbox.c3voc.de/dcim/devices/29/interfaces/)
## Lectern Module
![](img/voc-case2_0-lectern-front.jpeg)
![](img/voc-case2_0-lectern-back.jpeg)
<!-- TODO: Lectern Front -->
Use ethernet connections at the front unless a fiber trunk is needed via the SFP slots.
See the netbox for detailed port configuration:
Otherwise see the netbox for detailed port configuration:
[Case 1](https://netbox.c3voc.de/dcim/devices/30/interfaces/),
[Case 2](https://netbox.c3voc.de/dcim/devices/31/interfaces/),
[Case 3](https://netbox.c3voc.de/dcim/devices/32/interfaces/),
[Case 4](https://netbox.c3voc.de/dcim/devices/33/interfaces/),
[Case 5](https://netbox.c3voc.de/dcim/devices/34/interfaces/),
[Case 6](https://netbox.c3voc.de/dcim/devices/35/interfaces/)
- [Case 1](https://netbox.c3voc.de/dcim/devices/30/interfaces/)
- [Case 2](https://netbox.c3voc.de/dcim/devices/31/interfaces/)
- [Case 3](https://netbox.c3voc.de/dcim/devices/32/interfaces/)
- [Case 4](https://netbox.c3voc.de/dcim/devices/33/interfaces/)
- [Case 5](https://netbox.c3voc.de/dcim/devices/34/interfaces/)
- [Case 6](https://netbox.c3voc.de/dcim/devices/35/interfaces/)

Binary file not shown.

Before

Width:  |  Height:  |  Size: 500 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 MiB

After

Width:  |  Height:  |  Size: 612 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 630 KiB

After

Width:  |  Height:  |  Size: 855 KiB

Before After
Before After

Binary file not shown.

Before

Width:  |  Height:  |  Size: 791 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 299 KiB

After

Width:  |  Height:  |  Size: 362 KiB

Before After
Before After

Some files were not shown because too many files have changed in this diff Show more