This note explains how to setup Dendron as a web app which syncs notes to a git repository.
tl;dr:
- Setup code-server in a docker container.
- Run the container. Install the Dendron extension. Configure git
- Commit the docker image so that the Dendron installation and other settings persist
- Use a reverse proxy to serve the code-server over https, so it doesn’t grumble about being accessed in an insecure context and cripple itself
Setup code-server
-
Use the excellent linuxserver/code-server docker image
- Tweak the TZ, PASSWORD, SUDO_PASSWORD environment variables. I use a .env file for the actual passwords.
- Create a
.env
file in the same folder as thedocker-compose.yaml
file and add the passwords there
- Create a
- I ## the ports and instead create a network
code-server-npm
which I add to the Nginx Proxy Manager docker-compose file. You don’t need to do this if you don’t use NPM the way I do (Each of my docker app containers define anappname-npm
docker network. This is then added to NPM’s docker-compose file as an external network.)
- Tweak the TZ, PASSWORD, SUDO_PASSWORD environment variables. I use a .env file for the actual passwords.
-
The
docker-compose.yaml
file is1version: "2.1" 2services: 3code-server: 4 image: lscr.io/linuxserver/code-server:latest 5 container_name: code-server 6 environment: 7 - PUID=1000 8 - PGID=1000 9 - TZ=America/Los_Angeles 10 - PASSWORD=${PASSWORD} #optional 11 - HASHED_PASSWORD= #optional 12 - SUDO_PASSWORD=${SUDO_PASSWORD} #optional 13 - SUDO_PASSWORD_HASH= #optional 14 - PROXY_DOMAIN=code-server.my.domain #optional 15 - DEFAULT_WORKSPACE=/config/workspace #optional 16 volumes: 17 - ./config:/config 18# ports: 19# - 10.0.0.1:8443:8443 20 restart: unless-stopped 21 networks: 22 - code-server-npm 23 24networks: 25code-server-npm:
-
Create a file named
.env
in the same folder that hasdocker-compose.yaml
. Within that file,PASSWORD=somepassword SUDO_PASSWORD=somepassword
-
Also create a folder named
config
in the same folder that hasdocker-compose.yaml
. This is where Dendron/VS Code will store its data. -
Then spool up the container with
docker-compose up -d
- Logs can be checked with
docker logs -f code-server
- Logs can be checked with
Setup NPM
-
I use Nginx Proxy Manager (NPM) as a reverse proxy. It’s
docker-compose.yaml
file needs to contain (in addition to other things)1services: 2app: 3 networks: 4 - code-server_code-server-npm 5 6networks: 7code-server_code-server-npm: 8 external: true
-
Then (optional), in the NPM GUI add a new access list
- Details tab
- Name: pw-protect
- Satisfy Any: true
- Authorization tab
- Username: the-username
- Password: the-password
- This adds an additional username/pw authorization dialog before code-server web app is shown (which has its own password authorization)
- Details tab
-
Then, in the NPM GUI add a new proxy host
- Details tab
- Domain name: foo.example.com
- Scheme: http
- Forward Hostname / IP: code-server
- Forward Port: 8443
- Block common exploits: true
- Websockets support: true
- Access List: pw-protect
- SSL tab
- SSL Certificate: foo.example.com
- Force SSL: true
- HTTP/2 Support: true
- Details tab
-
Remember to do
docker-compose down
anddocker-compose up -d
to pull in the new changes.
NOTE: Websockets support must be enabled in the configuration of the NPM proxy host. If not, docker logs -f code-server
will show errors like
File not found: /app/code-server/lib/vscode/extensions/git-base/dist/browser/extension.js
File not found: /app/code-server/lib/vscode/extensions/emmet/dist/browser/emmetBrowserMain.js
File not found: /app/code-server/lib/vscode/extensions/merge-conflict/dist/browser/mergeConflictMain.js
Install Dendron
- Log in to https://foo.example.com. This is VS Code running in the browser.
- Install the Dendron extension and the other extensions it needs.
- Create a new workspace named e.g.
dendron-notes
- This will be a folder created in the
config
folder created above (in the same directory as thedocker-compose.yaml
file.)
- This will be a folder created in the
Configure git
I prefer to configure a connection to GitHub (or some other git server) so that the Dendron notes are synced to a remote repository. This takes care of backup 😃 and is also a synchronization mechanism. On another computer, you can clone the git repository and use it with a natively installed VS Code. Thus, the notes stay in sync between the web app version of Dendron and any other computers that Dendron is installed on.
- To configure git
- Create a
.gitignore
file in the Dendron workspace with contents from here - Sign in to GitHub first in the default browser of your computer.
- Go to the ‘Source Control’ area of code-server and follow the instructions to Push to GitHub.
- This was a bit unintuitive for me, but mess around and it’ll be done in a few minutes.
- Basically, you create a git repo in the Dendron workspace and push that to a Github repo.
- That repo should not already exist. code-server will create it for you.
- Open the terminal in code-server and
git config --global user.name "username"
git config --global user.email "email address"
- NOTE: It seems that code-server creates a “Master” branch rather than the newly politically correctly named “Main” branch. This shouldn’t be an issue since the repository does not already exist in GitHub. code-server creates it.
- At some point, VS Code may ask whether it should periodically auto-fetch from the remote repository. Saying “Yes” helps reduce the manual effort of pulling in any changes from the git remote
- Create a
Docker commit
- We’ve made a bunch of changes to code-server by installing the Dendron extension and configuring git.
- These changes will not persist if the docker container is restarted (
docker-compose down; docker-compose up
). - To commit the changes, we use Docker commit. Open another terminal on the docker host and
docker ps
to see the id of the code-server containerdocker commit <id> lscr.io/linuxserver/code-server:dendron
- Note that by using docker commit we created a new image that has Dendron and git configuration baked in.
- Now go back to the
docker-compose.yaml
file and update the lineimage: lscr.io/linuxserver/code-server:dendron
Additional tips
-
I use Linux with a heavily customized keyboard layout. However, code-server believed I was using ‘Layout: us’ and most of the keyboard shortcuts e.g. Ctrl+S to save or Ctrl+L for lookup didn’t work. When I pressed those key combinations, code-server would register some other keys being pressed. The fix for this is to go to code-server settings and set
"keyboard.dispatch" : "keyCode"
-
code-server must be served over https. Else, VS Code will complain about being accessed in an insecure context and many things, including Note Preview’s will not work
-
Ctrl+Shift+P
which is normally used for entering commands is hijacked by Firefox for launching a new private window. However,F1
key works well as an alternative keyboard shortcut. -
Shell access whilst the container is running:
docker exec -it code-server /bin/bash
-
To monitor the logs of the container in realtime:
docker logs -f code-server
Open questions
- It seems VS Code needs to authorize to GitHub each time after
docker-compose down; docker-compose up
. Not sure why this is the case, but ehh.