summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Carstairs <me@joeac.net>2026-08-06 10:45:03 +0100
committerJoe Carstairs <me@joeac.net>2026-08-06 10:45:03 +0100
commit832f232972c65e7ebed62000aefe825cf8d8ff38 (patch)
tree5b378cffc7b985f2f2e9dd41ec188f9ddd994b60
parent55100c1e0ffcd490b3e3257fe4e75296f4f32e62 (diff)
ansible-ise etherpad
-rw-r--r--ansible/playbook.yml9
-rw-r--r--ansible/roles/etherpad/tasks/main.yml65
-rw-r--r--ansible/roles/etherpad/templates/openrc/etherpad36
-rw-r--r--ansible/roles/etherpad/templates/settings.json (renamed from etherpad/settings.json.template)28
-rw-r--r--ansible/vars/etherpad.yml9
-rw-r--r--etherpad.Dockerfile11
-rw-r--r--etherpad/.gitignore2
-rw-r--r--etherpad/Makefile27
-rw-r--r--etherpad/install.mk13
-rw-r--r--make/vars.mk5
10 files changed, 133 insertions, 72 deletions
diff --git a/ansible/playbook.yml b/ansible/playbook.yml
index 4320e8f..c0b5abc 100644
--- a/ansible/playbook.yml
+++ b/ansible/playbook.yml
@@ -17,3 +17,12 @@
- ln
vars_files:
- common.yml
+
+- name: Install etherpad
+ hosts: "{{ services.etherpad.host }}"
+ become: true
+ roles:
+ - etherpad
+ vars_files:
+ - common.yml
+ - etherpad.yml
diff --git a/ansible/roles/etherpad/tasks/main.yml b/ansible/roles/etherpad/tasks/main.yml
new file mode 100644
index 0000000..8709049
--- /dev/null
+++ b/ansible/roles/etherpad/tasks/main.yml
@@ -0,0 +1,65 @@
+- name: Install PNPM and Git
+ community.general.apk:
+ name:
+ - pnpm
+ - git
+
+- name: Install tsx globally
+ ansible.builtin.shell: pnpm install --global tsx
+ register: pnpm_install_tsx
+ changed_when: "'Already up to date' not in pnpm_install_tsx.stdout"
+ environment:
+ PNPM_HOME: "{{ ansible_facts.env.HOME }}/.local/share/pnpm"
+ PATH: "{{ ansible_facts.env.PATH }}:{{ ansible_facts.env.HOME }}/.local/share/pnpm"
+
+- name: Checkout source code for latest etherpad release
+ register: etherpad_src
+ ansible.builtin.git:
+ repo: https://github.com/ether/etherpad.git
+ dest: "{{ etherpad_src_dir }}"
+ depth: 1
+ version: master
+
+- name: Install etherpad settings
+ register: etherpad_settings
+ ansible.builtin.template:
+ src: settings.json
+ dest: "{{ etherpad_src_dir }}/settings.json"
+ mode: "640"
+
+- name: Install etherpad dependencies
+ register: etherpad_dependencies
+ changed_when: "'Already up to date' not in etherpad_dependencies.stdout"
+ ansible.builtin.command:
+ chdir: "{{ etherpad_src_dir }}"
+ cmd: pnpm install
+
+- name: Install etherpad service
+ register: etherpad_service
+ ansible.builtin.template:
+ src: openrc/etherpad
+ dest: /etc/init.d/etherpad
+ mode: "755"
+
+- name: Restart etherpad service and configure to start on boot
+ when:
+ etherpad_src is changed
+ or etherpad_service is changed
+ or etherpad_settings is changed
+ or etherpad_dependencies is changed
+ ansible.builtin.service:
+ name: etherpad
+ enabled: true
+ state: restarted
+
+- name: Start etherpad service and configure to start on boot
+ when:
+ not (
+ etherpad_src is changed
+ or etherpad_settings is changed
+ or etherpad_service is changed
+ or etherpad_dependencies is changed )
+ ansible.builtin.service:
+ name: etherpad
+ enabled: true
+ state: started
diff --git a/ansible/roles/etherpad/templates/openrc/etherpad b/ansible/roles/etherpad/templates/openrc/etherpad
new file mode 100644
index 0000000..5c31e4b
--- /dev/null
+++ b/ansible/roles/etherpad/templates/openrc/etherpad
@@ -0,0 +1,36 @@
+#!/sbin/openrc-run
+
+description="Run etherpad document server"
+
+start()
+{
+ ebegin "Starting etherpad"
+ start-stop-daemon --start \
+ --env NODE_ENV={{ etherpad_node_env }} \
+ --exec /usr/bin/pnpx \
+ --background \
+ --chdir {{ etherpad_src_dir }} \
+ --stdout /var/log/etherpad.log \
+ --stderr /var/log/etherpad.log \
+ --make-pidfile \
+ --pidfile /run/etherpad.pid \
+ -- tsx src/node/server.ts
+ eend $?
+}
+
+stop()
+{
+ ebegin "Stopping etherpad"
+ start-stop-daemon --stop \
+ --exec /usr/bin/pnpx \
+ --pidfile /run/etherpad.pid
+ eend $?
+}
+
+restart()
+{
+ ebegin "Restarting etherpad"
+ svc_stop
+ svc_start
+ eend $?
+}
diff --git a/etherpad/settings.json.template b/ansible/roles/etherpad/templates/settings.json
index 09cf5c7..7818d93 100644
--- a/etherpad/settings.json.template
+++ b/ansible/roles/etherpad/templates/settings.json
@@ -5,16 +5,16 @@
"skinName": "colibris",
"skinVariants": "super-light-toolbar super-light-editor light-background",
"ip": "0.0.0.0",
- "port": ${ETHERPAD_PORT},
+ "port": {{ services.etherpad.port }},
"showSettingsInAdminPage": true,
- "enableMetrics": "$${ENABLE_METRICS:true}",
+ "enableMetrics": "${ENABLE_METRICS:true}",
"cleanup": {
"enabled": false,
"keepRevisions": 5
},
"dbType": "sqlite",
"dbSettings": {
- "filename": "var/etherpad.sq3"
+ "filename": "var/sqlite.db"
},
"defaultPadText" : "",
"padOptions": {
@@ -86,7 +86,7 @@
},
"users": {
"admin": {
- "password": "admin",
+ "password": "{{ etherpad_admin_password }}",
"is_admin": true
}
},
@@ -101,9 +101,9 @@
"max": 10
},
"importMaxFileSize": 52428800, // 50 * 1024 * 1024
- "authenticationMethod": "$${AUTHENTICATION_METHOD:sso}",
- "enableDarkMode": "$${ENABLE_DARK_MODE:true}",
- "enablePadWideSettings": "$${ENABLE_PAD_WIDE_SETTINGS:false}",
+ "authenticationMethod": "${AUTHENTICATION_METHOD:sso}",
+ "enableDarkMode": "${ENABLE_DARK_MODE:true}",
+ "enablePadWideSettings": "${ENABLE_PAD_WIDE_SETTINGS:false}",
"commitRateLimiting": {
"duration": 1,
"points": 10
@@ -113,21 +113,21 @@
"enableAdminUITests": false,
"lowerCasePadIds": false,
"sso": {
- "issuer": "$${SSO_ISSUER:http://localhost:${ETHERPAD_PORT}}",
+ "issuer": "${SSO_ISSUER:http://localhost:{{ services.etherpad.port }}}",
"clients": [
{
- "client_id": "$${ADMIN_CLIENT:admin_client}",
- "client_secret": "$${ADMIN_SECRET:admin}",
+ "client_id": "${ADMIN_CLIENT:admin_client}",
+ "client_secret": "${ADMIN_SECRET:admin}",
"grant_types": ["authorization_code"],
"response_types": ["code"],
- "redirect_uris": ["$${ADMIN_REDIRECT:http://localhost:${ETHERPAD_PORT}/admin/}"]
+ "redirect_uris": ["${ADMIN_REDIRECT:http://localhost:{{ services.etherpad.port }}/admin/}"]
},
{
- "client_id": "$${USER_CLIENT:user_client}",
- "client_secret": "$${USER_SECRET:user}",
+ "client_id": "${USER_CLIENT:user_client}",
+ "client_secret": "${USER_SECRET:user}",
"grant_types": ["authorization_code"],
"response_types": ["code"],
- "redirect_uris": ["$${USER_REDIRECT:http://localhost:${ETHERPAD_PORT}/}"]
+ "redirect_uris": ["${USER_REDIRECT:http://localhost:{{ services.etherpad.port }}/}"]
}
]
}
diff --git a/ansible/vars/etherpad.yml b/ansible/vars/etherpad.yml
new file mode 100644
index 0000000..1c14232
--- /dev/null
+++ b/ansible/vars/etherpad.yml
@@ -0,0 +1,9 @@
+etherpad_src_dir: /usr/local/lib/etherpad
+etherpad_node_env: production
+etherpad_admin_password: !vault |
+ $ANSIBLE_VAULT;1.2;AES256;ansible
+ 61323133386365613235326230313139396433653533613638353163336561363930326463366638
+ 6264633965363664333862666536636537383331326637630a643336646561643133613863386561
+ 33613830613461653432383534356533643938383063326363633833653939356232363836336565
+ 3961383965323537650a666430646338363637383233633531313735353931386433323337313133
+ 30663632646631396335333263336132616234663539623766366364626633313831
diff --git a/etherpad.Dockerfile b/etherpad.Dockerfile
deleted file mode 100644
index fd76a88..0000000
--- a/etherpad.Dockerfile
+++ /dev/null
@@ -1,11 +0,0 @@
-ARG ALPINE_VERSION=3.23
-FROM docker.io/alpine:${ALPINE_VERSION}
-RUN mkdir -p /var/app
-WORKDIR /var/app
-ARG ETHERPAD_VERSION
-RUN apk --no-cache add pnpm \
- && ENV=~/.profile SHELL=sh pnpm setup \
- && source ~/.profile \
- && pnpm install --global tsx
-COPY etherpad/etherpad-${ETHERPAD_VERSION} .
-CMD pnpx tsx src/node/server.ts
diff --git a/etherpad/.gitignore b/etherpad/.gitignore
deleted file mode 100644
index 455789d..0000000
--- a/etherpad/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-var
-etherpad-*
diff --git a/etherpad/Makefile b/etherpad/Makefile
deleted file mode 100644
index aa010d5..0000000
--- a/etherpad/Makefile
+++ /dev/null
@@ -1,27 +0,0 @@
-ETHERPAD_VERSION := 3.3.2
-SRC_DIR := etherpad-$(ETHERPAD_VERSION)
-
-.PHONY: all
-all: download_etherpad install_deps
-
-.PHONY: download_etherpad
-download_etherpad: $(SRC_DIR)
-
-$(SRC_DIR):
- wget -O- https://github.com/ether/etherpad/archive/refs/tags/v3.3.2.tar.gz | tar -xz
-
-.PHONY: install_deps
-install_deps: $(SRC_DIR)/node_modules
-
-$(SRC_DIR)/node_modules: $(SRC_DIR) $(SRC_DIR)/settings.json $(SRC_DIR)/package.json $(SRC_DIR)/pnpm-lock.yaml
- cd $(SRC_DIR) && pnpm install
-
-$(SRC_DIR)/settings.json: $(SRC_DIR) settings.json.template
-ifdef ETHERPAD_PORT
- ETHERPAD_PORT=$(ETHERPAD_PORT) envsubst -no-unset -i settings.json.template -o $(SRC_DIR)/settings.json
-else
- $(error ETHERPAD_PORT is not defined)
-endif
-
-clean:
- rm -rf etherpad-*/
diff --git a/etherpad/install.mk b/etherpad/install.mk
deleted file mode 100644
index 17d9bbf..0000000
--- a/etherpad/install.mk
+++ /dev/null
@@ -1,13 +0,0 @@
-.PHONY: install
-install: $(ETHERPAD_DATA_DIR)
-
-.PHONY: reinstall
-reinstall: $(ETHERPAD_DATA_DIR)
-
-$(ETHERPAD_DATA_DIR):
- sudo mkdir -p $(ETHERPAD_DATA_DIR)
- ETHERPAD_USER=$(whoami) && sudo chown $$ETHERPAD_USER:$$ETHERPAD_USER $(ETHERPAD_DATA_DIR)
-
-.PHONY: uninstall
-uninstall:
- $(info Nothing to do)
diff --git a/make/vars.mk b/make/vars.mk
index 8daf287..1eb3d93 100644
--- a/make/vars.mk
+++ b/make/vars.mk
@@ -24,20 +24,17 @@ SUBDOMAIN_vaultwarden := pwd
SUBDOMAIN_etherpad := docs
PORT_actualbudget := 5006
-PORT_etherpad := 9001
PORT_http := 8080
PORT_gemini := 1965
PORT_smtp := 2500
PORT_vaultwarden := 9000
export ACTUALBUDGET_DATA_DIR := /var/joeac.net-actualbudget/var
-export ETHERPAD_DATA_DIR := /var/etherpad/var
export GEMINI_CERTIFICATES_DIR := /var/joeac.net-gemini/certificates
export GEMINI_COMITIUM_DATA_DIR := /var/joeac.net-gemini/comitium-data
export VAULTWARDEN_DATA_DIR := /var/vaultwarden/data
ALPINE_VERSION := 3.23
-ETHERPAD_VERSION := 3.3.2
$(foreach module,$(ALL_MODULES),$(if $(PORT_$(module)),$(eval \
export $(call capitalise,$(module))_PORT := $(PORT_$(module)))))
@@ -65,8 +62,6 @@ COMPOSE_CMD := \
IMAGE_PREFIX="$(IMAGE_PREFIX)" \
GEMINI_CERTIFICATES_DIR="$(GEMINI_CERTIFICATES_DIR)" \
GEMINI_COMITIUM_DATA_DIR="$(GEMINI_COMITIUM_DATA_DIR)" \
- ETHERPAD_DATA_DIR="$(ETHERPAD_DATA_DIR)" \
- ETHERPAD_VERSION="$(ETHERPAD_VERSION)" \
VAULTWARDEN_DATA_DIR="$(VAULTWARDEN_DATA_DIR)" \
LOCAL_SMTP_PORT=$(PORT_smtp) \
$(foreach module,$(ALL_MODULES),$(call capitalise,$(module))_PORT=$(PORT_$(module))) \