summaryrefslogtreecommitdiffstats
path: root/organizers-notebook.md
diff options
context:
space:
mode:
authorSacha Chua <sacha@sachachua.com>2025-11-27 13:32:02 -0500
committerSacha Chua <sacha@sachachua.com>2025-11-27 13:32:02 -0500
commit2ea3728c5cf47efb7ff2ad9d3e8e522ad3a8b70c (patch)
tree74eaa21136a8cfd87ab4579aa1e76b7472570bdd /organizers-notebook.md
parent3f41c121ea527621b51bf4e04a9d0e134a0261f3 (diff)
downloademacsconf-wiki-2ea3728c5cf47efb7ff2ad9d3e8e522ad3a8b70c.tar.xz
emacsconf-wiki-2ea3728c5cf47efb7ff2ad9d3e8e522ad3a8b70c.zip
cancel authoring
Diffstat (limited to 'organizers-notebook.md')
-rw-r--r--organizers-notebook.md274
1 files changed, 166 insertions, 108 deletions
diff --git a/organizers-notebook.md b/organizers-notebook.md
index a4d65644..b3bd61c4 100644
--- a/organizers-notebook.md
+++ b/organizers-notebook.md
@@ -28,7 +28,7 @@ This document is the general organizers' notebook that can be used as a starting
- [Post the schedule](#phases-and-lessons-learned-post-the-schedule)
- [Process uploaded files](#phases-and-lessons-learned-process-uploaded-files)
- [Generate assets](#phases-and-lessons-learned-generate-assets)
- - [Record pronunciations](#orgd8c5164)
+ - [Record pronunciations](#phases-and-lessons-learned-record-pronunciations)
- [Prepare the infrastructure](#phases-and-lessons-learned-prepare-the-infrastructure)
- [Getting ready for captions](#phases-and-lessons-learned-getting-ready-for-captions)
- [Getting ready for the conference](#pre-conf)
@@ -39,6 +39,7 @@ This document is the general organizers' notebook that can be used as a starting
- [Linode instance sizes](#general-infrastructure-linode-instance-sizes)
- [File uploads](#upload)
- [Media processing](#general-infrastructure-media-processing)
+ - [Wiki](#orgeaf5478)
- [Icecast](#icecast)
- [Watching pages](#watch)
- [VNC](#vnc)
@@ -51,9 +52,11 @@ This document is the general organizers' notebook that can be used as a starting
- [Automated IRC announcements](#general-infrastructure-automated-irc-announcements)
- [BigBlueButton](#bbb)
- [Manual IRC announcements](#general-infrastructure-manual-irc-announcements)
+ - [Confirm automated IRC announcements from res](#general-infrastructure-confirm-automated-irc-announcements-from-res)
- [Low-res stream](#general-infrastructure-low-res-stream)
- [Upload talks to YouTube](#general-infrastructure-upload-talks-to-youtube)
- [Restream to YouTube](#general-infrastructure-restream-to-youtube)
+ - [Restream to Toobnix](#orgd102e79)
- [Other process notes](#other)
- [Adding another user to BBB](#bbb-user)
- [When a talk is added after the schedule has already been drafted](#other-process-notes-when-a-talk-is-added-after-the-schedule-has-already-been-drafted)
@@ -353,7 +356,7 @@ Lessons learned:
- Next year, let&rsquo;s get upload.emacsconf.org in place as the domain name so that people don&rsquo;t try to FTP files to it.
-### TODO Send backstage and upload instructions :email:
+### DONE Send backstage and upload instructions :email:
<a id="phases-and-lessons-learned-post-the-schedule"></a>
@@ -382,6 +385,7 @@ Process:
1. Review uploaded files with <elisp:emacsconf-upload-dired>
2. Open the JSON for the file you want to process and use <elisp:emacsconf-upload-copy-from-json> .
If more than one file uses the same extension, provide a suffix to disambiguate them.
+ If emacsconf-upload-copy-from-json might take a long time, you can also scp the file to your local
3. On res:
1. Create a directory ~/current/files/$slug.
2. Copy the uploaded file from ~/cache as `$video_slug--original.$extension`, or use `rename-original.sh $slug $file`.
@@ -394,7 +398,7 @@ Process:
<a id="phases-and-lessons-learned-generate-assets"></a>
-## Generate assets
+## TODO Generate assets
### In-between pages
@@ -410,15 +414,29 @@ Process:
- Splice together into a file that will be processed with subed-record-compile-video.
-<a id="orgd8c5164"></a>
+### TODO Test videos
+
+<elisp:emacsconf-stream-generate-test-videos>
+
+
+<a id="phases-and-lessons-learned-record-pronunciations"></a>
## Record pronunciations
-### TODO Record pronunciations
+### DONE Record pronunciations
+1. mkdir -p ~/proj/emacsconf/2025/assets/intros ~/proj/emacsconf/2025/assets/in-between
+2. cp ~/proj/emacsconf/2024/assets/in-between/template.svg ~/proj/emacsconf/2025/assets/in-between/template.svg
+3. <elisp:emacsconf-stream-generate-in-between-pages>
+4. Create ~/proj/emacsconf/2025/assets/intros/intro.vtt
+5. <elisp:emacsconf-subed-intro-subtitles>
+6. Record the audio, possibly with subed-record, left, and right.
+7. Split the lines for nicer subtitles.
+8. Use <elisp:subed-record-compile>
-### TODO E-mail speakers asking them to confirm the pronunciations
+
+### DONE E-mail speakers asking them to confirm the pronunciations
<a id="phases-and-lessons-learned-prepare-the-infrastructure"></a>
@@ -461,6 +479,11 @@ Onboarding:
<elisp:emacsconf-pad-prepopulate-shift-hyperlists>
+### STARTED Check in with speakers for cancellations, adjustments
+
+emacsconf-mail-intro-to-all
+
+
### TODO Send check-in details, schedule update, etc. :email:
@@ -771,18 +794,19 @@ After the conference:
1. Make sure `group_vars/all.yml` has the correct setting for `emacsconf_year`.
2. `ansible-playbook -i inventory.yml prod-playbook.yml --tags prerec`
3. Set up the `update-cache` script.
-
- #!/bin/bash
- # export CONF_PUBLIC=1
- rsync -avzue ssh --exclude .lock-\* res:~/cache/ ~/proj/emacsconf/2025/cache/ --exclude .git
- chmod ugo+r . -R
- rsync -avzue ssh ~/proj/emacsconf/2025/cache/ res:~/cache/ $* --exclude .git
- rsync -avzue ssh ~/proj/emacsconf/2025/cache/ orga@media:/var/www/media.emacsconf.org/2025/backstage/ $* --exclude .git
- ssh orga@media "cd ~/backstage; chmod ugo+r -- *"
- if [ ! -z "$CONF_PUBLIC" ]; then
- echo "Updating public media"
- rsync -avzue ssh --exclude \*--original\* --exclude \*--reencoded\* ~/proj/emacsconf/2025/cache/ orga@media:/var/www/media.emacsconf.org/2025/ 3--exclude .git
- fi
+
+ #!/bin/bash
+ # export CONF_PUBLIC=1
+ rsync -avzue ssh --exclude .lock-\* --exclude 'partial--*' res:~/cache/ ~/proj/emacsconf/2025/cache/ --exclude .git
+ chmod ugo+r . -R
+ rsync -avzue ssh --exclude .lock-\* --exclude 'partial--*' res:~/cache/ ~/proj/emacsconf/2025/cache/ --exclude .git
+ rsync -avzue ssh --exclude 'partial--*' ~/proj/emacsconf/2025/cache/ res:~/cache/ $* --exclude .git
+ ssh orga@media "cd ~/backstage; chmod ugo+r -- *"
+ if [ ! -z "$CONF_PUBLIC" ]; then
+ echo "Updating public media"
+ rsync -avzue ssh --exclude \*--original\* --exclude \*--reencoded\* ~/proj/emacsconf/2025/cache/ orga@media:/var/www/media.emacsconf.org/2025/ 3--exclude .git
+ fi
+ rsync -avzue ssh ~/proj/emacsconf/2025/assets/ res:~/current/assets/
When a talk comes in:
@@ -799,17 +823,28 @@ When a talk comes in:
9. `emacsconf-publish-backstage-index`
+<a id="orgeaf5478"></a>
+
+## Wiki
+
+Stylesheet: <file://ssh:front|sudo:ikiwiki@front:/var/www/emacsconf.org/style.css>
+
+See also Ansible notes
+
+
<a id="icecast"></a>
-## Icecast
+## DONE Icecast
-Success: You can use [OBS+VNC to record](#obs-instructions), and the results can be viewed by mpv.
+Success: You can send a stream to Icecast and the results can be viewed by mpv.
- [X] Gen
- [X] Dev
Also, recordings are available in /data.
+See also: [Use OBS+VNC to record](#obs-instructions)
+
New year:
1. Reprovision with
@@ -822,8 +857,8 @@ New year:
3. To test, you can use FFmpeg like this for the gen stream:
ffmpeg -y -f lavfi -i testsrc=size=1280x720:rate=10 -i background-music.opus \
- -c:v libvpx -b:v 500K -crf 25 -b:a 128k \
- -content_type video/webm "icecast://emacsconf:$EMACSCONF_ICECAST_SOURCE_PASSWORD@live0.emacsconf.org:8001/gen.webm"
+ -c:v libvpx -b:v 500K -crf 25 -b:a 128k \
+ -content_type video/webm "icecast://emacsconf:$EMACSCONF_ICECAST_SOURCE_PASSWORD@live0.emacsconf.org:8001/gen.webm"
For dev:
@@ -834,11 +869,18 @@ New year:
and then view it with
mpv https://live0.emacsconf.org/gen.webm
+ mpv https://live0.emacsconf.org/dev.webm
+
+
+### Cooldown
+
+ssh live0.emacsconf.org
+sudo /etc/init.d/emacsconf stop
<a id="watch"></a>
-## Watching pages
+## DONE Watching pages
Success: You can watch at <https://live.emacsconf.org>.
@@ -858,7 +900,7 @@ Set up test streams (see ffmpeg instructions from [Icecast](#icecast)) and then:
<a id="vnc"></a>
-## VNC
+## DONE VNC
We use VNC to connect to the X servers on res.emacsconf.org so that we can stream from it.
@@ -867,10 +909,6 @@ Success:
- [X] Confirm that you can connect to emacsconf-gen via VNC
- [X] Confirm that you can connect to emacsconf-dev via VNC
-Setting up
-
-- <elisp:emacsconf-publish-res-index>
-
<a id="vnc-instructions"></a>
@@ -913,21 +951,29 @@ and then connect with:
xvncviewer 127.0.0.1:$TRACK_PORT -shared -geometry 1280x720 -passwd vnc-passwd-$TRACK &
+### Cooldown
+
+ssh sachac@res
+sudo killall Xtigervnc
+
+
<a id="obs"></a>
-## Streaming with OBS
+## DONE Streaming with OBS
-Success: Confirm that you can stream
+Success: You can use [OBS+VNC to record](#obs-instructions), and the results can be viewed by mpv.
- [X] gen
- [X] dev
New year: reprovision with
- ansible-playbook -i inventory.yml prod-playbook.yml --tags obs
+ ansible-playbook -i inventory.yml prod-playbook.yml --tags obs,stream
so that the year is updated in the shell scripts.
+icecast is on live0.emacsconf.org and can be restarted with `/etc/init.d/emacsconf restart`.
+
<a id="obs-instructions"></a>
@@ -941,22 +987,8 @@ so that the year is updated in the shell scripts.
mpv https://live0.emacsconf.org/$TRACK.webm &
-
-### Icecast
-
-Success: You can use [OBS+VNC to record](#obs-instructions), and the results can be viewed by mpv.
-
-- [ ] gen
-- [ ] dev
-
-New year: reprovision with
-
- ansible-playbook -i inventory.yml prod-playbook.yml --tags stream
-
so that the year is updated in the configuration.
-This is on live.emacsconf.org and can be restarted with `/etc/init.d/emacsconf restart`.
-
<a id="general-infrastructure-shell-scripts"></a>
@@ -1081,17 +1113,17 @@ Success:
- [X] You can join from <https://chat.emacsconf.org>
- [X] You can join from <https://live.emacsconf.org> and the channels end up as the latest ones
+On front:
+sudo -u thelounge node /usr/bin/thelounge start
+
+
+### DONE Ask libera.chat to increase IRC limits
+
Remember to schedule a task to ask libera.chat to increase the number of users it will accept from chat.emacsconf.org to avoid connection exhaustion errors.
Message I&rsquo;ve posted to support@libera.chat:
-Thank you for running libera.chat. We&rsquo;re looking forward to using IRC
-(#emacsconf-gen, #emacsconf-dev) for the discussions for the upcoming
-EmacsConf (Dec 7-8, <https://emacsconf.org>). In the past, we&rsquo;ve needed to
-coordinate with Libera staff to increase the number of connections
-allowed from chat.emacsconf.org during conference days in order to avoid
-connection exhaustion errors. Is that something we can plan now or would
-you like me to bring it up a few days before the conference?
+Thank you for running libera.chat. We&rsquo;re looking forward to using IRC (#emacsconf, #emacsconf-gen, #emacsconf-dev, #emacsconf-org) for the discussions for the upcoming EmacsConf (Dec 6-7, <https://emacsconf.org>). In the past, we&rsquo;ve needed to coordinate with Libera staff to increase the number of connections allowed from chat.emacsconf.org during conference days in order to avoid connection exhaustion errors. Is that something we can plan now or would you like me to bring it up a few days before the conference?
<a id="general-infrastructure-etherpad"></a>
@@ -1170,8 +1202,11 @@ Sizes:
- dormant: 1 GB nanode
- testing: 4 core 8 GB shared CPU
- production: 8 core 16 GB dedicated CPU (roughly half CPU load for 107 simultaneous users, 2024)
+ - maybe 8 core 16 GB shared CPU next?
+<a id="general-infrastructure-bigbluebutton-installing-bigbluebutton"></a>
+
### Installing BigBlueButton
1. Create the instance.
@@ -1209,68 +1244,39 @@ BBB says sharing system audio works only if you use Chrome on Mac OS X or Micros
Related: <https://github.com/bigbluebutton/bigbluebutton/issues/8632>
-### Creating talk BBB rooms
+### DONE Create meeting rooms for each speaker
-- `docker exec -it greenlight-v3 /bin/bash`
-- `bundle exec rails console`
-- `user_id = User.find_by_email("sacha@sachachua.com").id`
+ docker exec -it greenlight-v3 /bin/bash -c "bundle exec rails console"
- (mapconcat (lambda (group)
- (format
- "Room.create(user_id: user_id, name: \"%s - %s\")\n"
- (plist-get (cadr group) :speakers)
- (string-join (mapcar (lambda (talk) (plist-get talk :slug))
- (cdr group)))))
- (emacsconf-mail-groups (emacsconf-active-talks (emacsconf-get-talk-info)))
- "")
+ user_id = User.find_by_email("emacsconf@sachachua.com").id
-- <elisp:emacsconf-publish-bbb-static-redirects>
+1. <elisp:emacsconf-bbb-create-rooms>
+2. <elisp:emacsconf-bbb-load-rooms>: set the ROOM properties.
+3. <elisp:emacsconf-publish-bbb-static-redirects>
-Print out the room IDs with
+Print out the room IDs with:
Room.all.each { |x| puts x.friendly_id + " " + x.name }; nil
It&rsquo;s possible to change the friendly\_id and then use `x.save!`.
-### Setting up moderator access codes
-
- (dolist (talk (seq-filter (lambda (o)
- (and (plist-get o :bbb-room)
- (not (plist-get o :bbb-mod-code))))
- (emacsconf-publish-prepare-for-display (emacsconf-get-talk-info))))
- (spookfox-js-injection-eval-in-active-tab
- (format "window.location.href = \"%s\""
- (replace-regexp-in-string "/join" "" (plist-get talk :bbb-room)))
- t)
- (sleep-for 3)
- (spookfox-js-injection-eval-in-active-tab
- "document.querySelector('button[data-rr-ui-event-key=\"settings\"]').click()" t)
- (spookfox-js-injection-eval-in-active-tab
- "document.querySelector('input#glAnyoneCanStart').checked = true")
- (spookfox-js-injection-eval-in-active-tab
- "document.querySelector('input#muteOnStart').checked = true")
- (spookfox-js-injection-eval-in-active-tab
- "document.querySelectorAll('.border-end button')[2].click()" t)
- (let ((code (spookfox-js-injection-eval-in-active-tab
- "document.querySelector('.access-code-input input').value" t)))
- (message "Setting %s to %s" (plist-get talk :slug) code)
- (emacsconf-set-property-from-slug
- talk "BBB_MOD_CODE"
- code)
- (sit-for 2)))
-
- (dolist (talk (seq-filter (lambda (o)
- (plist-get o :bbb-room))
- (emacsconf-publish-prepare-for-display (emacsconf-get-talk-info))))
- (spookfox-js-injection-eval-in-active-tab
- (format "window.location.href = \"%s\""
- (replace-regexp-in-string "/join" "" (plist-get talk :bbb-room)))
- t)
- (sleep-for 3)
- (spookfox-js-injection-eval-in-active-tab
- "document.querySelector('button[data-rr-ui-event-key=\"settings\"]').click()" t)
- (sleep-for 3))
+### DONE Set up moderator access codes
+
+- <elisp:emacsconf-bbb-spookfox-set-moderator-codes>
+- <elisp:emacsconf-bbb-spookfox-confirm-settings>
+
+Then you can use <elisp:emacsconf-mail-checkin-instructions-for-attending-speakers>
+or <elisp:emacsconf-mail-checkin-instructions-to-all> to send the info.
+
+
+### Processing BBB videos
+
+`bbb-record --list` shows all the recordings. You can use `bbb-record --rebuild` to regenerate the meeting, and `bbb-record --watch` to monitor progress. Presentation is a web-based interface, video is a single video file that contains the webcam, the screenshare, and the audio.
+
+If you don&rsquo;t see the video format, doublecheck that [the video format is enabled](#general-infrastructure-bigbluebutton-installing-bigbluebutton).
+
+bbb-record seems to call `ruby /usr/local/bigbluebutton/core/scripts/process/video.rb -m ID`, which might be a useful backup.
### Backing up BBB :backup:
@@ -1282,11 +1288,17 @@ ssh root@bbb &rsquo;tar zcvf - /var/bigbluebutton /etc/bigbluebutton /root/green
ssh root@bbb &rsquo;dd if=/dev/sda bs=5M &rsquo; | dd of=bbb-img-$(date &ldquo;+%Y-%m-%d&rdquo;).img status=progress
-### Spinning BBB up again
+### Scaling BBB up and down
+
+[Scaling a BigBlueButton server down to a 1 GB node between uses](https://sachachua.com/blog/2025/01/scaling-a-bigbluebutton-server-down-to-a-1-gb-node-between-uses/)
+
+When the server is downscaled, `/etc/nginx/sites-backup` configures the Nginx.
+The web root is `/var/www/bigbluebutton-default/assets`, and the page is `/var/www/bigbluebutton-default/assets/backup/index.html`.
-<span class="timestamp-wrapper"><time class="timestamp" datetime="2025-01-22">[2025-01-22 Wed]</time></span> &hellip; actually, this ran into some issues with the certificate, so I&rsquo;m just going to do a reinstall.
-Previous notes
+### Spinning BBB up again from scratch
+
+Previous notes:
1. Create a Nanode.
2. Update the DNS for bbb.emacsverse.org with its IP address. (dns.he.net)
@@ -1313,13 +1325,22 @@ Resources:
<a id="general-infrastructure-manual-irc-announcements"></a>
-## Manual IRC announcements
+## TODO Manual IRC announcements
Success:
- [X] You can /opall, /conftopic, and /broadcast
+<a id="general-infrastructure-confirm-automated-irc-announcements-from-res"></a>
+
+## TODO Confirm automated IRC announcements from res
+
+Success:
+
+- A test schedule can generate announcements.
+
+
<a id="general-infrastructure-low-res-stream"></a>
## Low-res stream
@@ -1372,6 +1393,43 @@ backup on live:
## Restream to YouTube
+### TODO Set up YouTube restreaming events
+
+Need to have set up shifts first.
+
+1. Switch to the EmacsConf account.
+2. Go to <https://studio.youtube.com/channel/UCwuyodzTl_KdEKNuJmeo99A>
+3. Create > Go live > Schedule stream.
+ - [X] Gen - Sat AM
+ - [X] Gen - Sat PM
+ - [X] Dev - Sat AM
+ - [X] Dev - Sat PM
+ - [X] Gen - Sun AM
+ - [X] Gen - Sun PM
+ - [X] Test
+
+ emacsconf-stream-copy-livestream-description
+
+ Then set the emacsconf-rtmp-shifts variable. See the conf.org from 2025 for an example.
+
+ This will be used in the shift hyperlists, which you can generate with emacsconf-pad-prepopulate-shift-hyperlists
+
+ There&rsquo;s also a note in the ansible README.org about restreaming.
+ Set up the `restreaming_platforms` variable in `prod-vars.yml` and
+ use `ansible-playbook -i inventory.yml prod-playbook.yml --tags restream` to set up
+
+
+<a id="orgd102e79"></a>
+
+## Restream to Toobnix
+
+
+### STARTED Set up Toobnix restreaming events
+
+1. <https://toobnix.org>, Publish, Permanent/recurring live
+2. emacsconf-stream-toobnix-copy-livestream-description
+
+
<a id="other"></a>
# Other process notes