This repository contains infrastructure-as-code ansible configurations for various pieces of the EmacsConf infrastructure. ansible-galaxy collection install community.general Production: needs prod-vars.yml, see prod-vars.yml.sample Docker: needs docker-vars.yml, see docker-vars.yml.sample * How to use this playbook 1. Install ansible on your local machine and check out this repo. 2. Copy the ansible_vars block from conf.org to prod-vars.yml in this repo (alongside inventory.yml), or set emacsconf-ansible-directory in Emacs and then use emacsconf-ansible-tangle-vars to tangle the file. 3. scp orga@res.emacsconf.org:~/authorized_keys . (if you're setting up any user accounts) 4. Find the ansible-playbook command you want to run and try it out. * Wiki ** Ikiwiki *** Prod When you update htmlscrubber.pm in wiki/templates: ansible-playbook -i inventory.yml prod-playbook.yml --tags wiki-plugins ansible-playbook -i docker-inventory.yml docker-reuse-playbook.yml --tags wiki-plugins ansible-playbook -i inventory.yml prod-playbook.yml --tags wiki *** Docker Goal: - [X] Load the wiki at http://localhost:28080 - [X] Add SSH key - [X] Add as remote - [X] Push to the wiki - [X] Have the changes show up automatically - [X] Have ansible copy the SSH key file:/docker:emacsconf-front:/home/ikiwiki/emacsconf.setup Creating: ansible-playbook -i docker-inventory.yml docker-playbook.yml --tags wiki Reusing: ansible-playbook -i docker-inventory.yml docker-reuse-playbook.yml --tags wiki Copying your SSH key: set the docker_ssh_key Ansible variable to the path of your public key or docker cp ~/.ssh/id_rsa.pub emacsconf-front:/home/ikiwiki/.ssh/authorized_keys2 docker exec emacsconf-front chown ikiwiki:ikiwiki /home/ikiwiki/.ssh/authorized_keys2 docker exec emacsconf-front chmod 600 /home/ikiwiki/.ssh/authorized_keys2 http://localhost:28080/ ssh localhost -p 2022 docker exec -it emacsconf-front /bin/bash git remote add docker ssh://ikiwiki@127.0.0.1:2222/var/www/wiki.git Debugging ssh wiki 'cd /var/www/wiki.git; git update-ref refs/heads/master HEAD^' && git push docker 2022-pages * Publishing Goals: - [X] Set up Emacs 28.2 or a newer one - [X] Check out the repositories - [X] Load the configuration - [X] Publish the backstage index - [X] Publish the watchpages - [X] Publish schedule to the wiki and push - [ ] Have nice interactive setup - [ ] Publish backstage index on a hook - [ ] Connect to IRC and announce talks - [ ] Push talk info the text files on the stream - [ ] Start mpv in the right display - [ ] Publish the prerec files - [ ] Publish the prerec on the page ** Prod To run the playbook and publish the main schedule: #+begin_src sh ansible-playbook -i inventory.yml prod-playbook.yml --tags wiki-publish --extra-vars='{"force_publish": true}' #+end_src #+RESULTS: :results: :end: Update a specific talk's before/nav and the main schedule: (ex: wayland) ansible-playbook playbook.yml -e '{"slug": "wayland"}' -i inventory.yml --tags publish Force-publish the schedule: ansible-playbook -i inventory.yml prod-playbook.yml --tags publish -e force_publish=true ** Docker Creating: ansible-playbook -i docker-inventory.yml docker-playbook.yml --tags wiki,publish Reusing: ansible-playbook -i docker-inventory.yml docker-reuse-playbook.yml --tags publish With docker: https://stackoverflow.com/questions/24738264/how-to-test-ansible-playbook-using-docker * Pad ** Production ansible-playbook -i inventory.yml prod-playbook.yml --tags pad,proxy To fall back to wikimedia rewrite: ansible-playbook -i inventory.yml prod-playbook.yml --tags proxy --extra-vars='{"use_wikimedia": true}' You can still access pads directly with direct/p like this: https://pad.emacsconf.org/direct/p/2022-journalism To undo wikimedia rewrite: ansible-playbook -i inventory.yml prod-playbook.yml --tags proxy To prepare for a load test: ansible-playbook -i inventory.yml prod-playbook.yml --tags pad --extra-vars='{"etherpad_load_test": true}' ** Docker Creating: ansible-playbook -i docker-inventory.yml docker-playbook.yml --tags pad Reusing an existing container: ansible-playbook -i docker-inventory.yml docker-reuse-playbook.yml --tags pad Connecting: docker exec -it emacsconf-pad /bin/bash Creating pads ansible-playbook -i docker-inventory.yml docker-reuse-playbook.yml --tags create-pads file:/docker:emacsconf-pad:/home/etherpad/etherpad/ Getting the API key #+NAME: pad-key #+begin_src sh docker exec emacsconf-pad cat /home/etherpad/etherpad/APIKEY.txt #+end_src #+RESULTS: pad-key :results: b7a15dc34cc7f6917cca6cd9a2b4b92145af7c7cd9b341af34869ab8cd3568be :end: #+begin_src sh :var padkey=pad-key echo curl "http://localhost:9001/api/1/createPad?apikey=$padkey&padID=emacsconf-2022" curl "http://localhost:9001/api/1/createPad?apikey=$padkey&padID=emacsconf-2022" #+end_src #+RESULTS: :results: curl http://localhost:9001/api/1/createPad?apikey=b7a15dc34cc7f6917cca6cd9a2b4b92145af7c7cd9b341af34869ab8cd3568be&padID=emacsconf-2022 {"code":0,"message":"ok","data":null} :end: ** Useful https://github.com/systemli/ansible-role-etherpad https://gist.github.com/aaronpk/7307172 * Pad proxy ansible-playbook -i inventory.yml prod-playbook.yml --tags proxy --extra-vars='{"use_wikimedia": false}' ansible-playbook -i inventory.yml prod-playbook.yml --tags proxy --extra-vars='{"use_wikimedia": true}' * Upload /ssh:media|sudo:upload@media:~upload /ssh:media|sudo::/etc/nginx/sites-available * Stream ** Prod Setting up icecast: ansible-playbook -i inventory.yml prod-playbook.yml --tags stream ** Testing Runs the ffmpeg command on res ansible-playbook -i inventory.yml prod-playbook.yml --tags test -e icecast_test_file=/home/orga/test.webm -e icecast_test=file -e icecast_test_track=dev Play the stream with MPV: ansible-playbook -i inventory.yml prod-playbook.yml --tags test -e icecast_test_track=dev -e icecast_test=mpv Use a test pattern (don't know if this works) ansible-playbook -i inventory.yml prod-playbook.yml --tags test -e icecast_test_track=dev -e icecast_test=pattern * Captioning Set up whisper: ansible-playbook -i inventory.yml prod-playbook.yml --tags caption Update caption script: ansible-playbook -i inventory.yml prod-playbook.yml --tags process-captions ffmpeg -y -i handwritten/reencode.webm -t 60 -vcodec copy -acodec copy test.webm * Other useful things nodemon -w . -e yml -x 'ansible-playbook -i inventory.yml prod-playbook.yml --tags vnc; true' * OBS Resizing VNC after connection xrandr -s 1280x720 Firefox profiles like to be created in an X environment firefox -no-remote -CreateProfile "{{ emacsconf_id }}-{{ item.item.id }} Update scenes from the gen copy: ssh emacsconf-gen@res.emacsconf.org "cat ~/.config/obs-studio/basic/scenes/gen.json" | jq 'walk(if type == "string" then gsub("emacsconf"; "{{ emacsconf_id }}") | gsub("gen"; "{{ item.id }}") else . end)' > roles/obs/templates/scenes.json ansible-playbook -i inventory.yml prod-playbook.yml --tags obs-scene Update scenes from the dev copy: ssh emacsconf-dev@res.emacsconf.org "cat ~/.config/obs-studio/basic/scenes/dev.json" | jq 'walk(if type == "string" then gsub("emacsconf"; "{{ emacsconf_id }}") | gsub("dev"; "{{ item.id }}") else . end)' > scenes.json