#+date: <2024-02-21 Wed 00:00:00> #+title: Self-Hosting Guide: An Otter Wiki #+description: Stepwise directions for installing Otter Wiki, configuring Docker Compose environment, and setting up Nginx reverse proxy for secure access. #+slug: self-hosting-otter-wiki #+filetags: :docker:nginx:self-hosting: * An Otter Wiki [[https://otterwiki.com/][An Otter Wiki]] is an easy to use wiki software that takes almost no effort to set up and maintain. * Installation To install An Otter Wiki, I'm going to use Docker Compose to create the container and then use Nginx as a reverse proxy to allow external access via a subdomain I own. ** Docker Compose Start by creating a directory for the container's files. #+begin_src sh mkdir ~/otterwiki #+end_src Next, create the =docker-compose.yml= file to define the container's parameters. #+begin_src sh nano ~/otterwiki/docker-compose.yml #+end_src Within the file, paste the following content. You can read the project's documentation if you want to further override or customize the container. #+begin_src conf version: '3' services: otterwiki: image: redimp/otterwiki:2 restart: unless-stopped # Internal port must be assigned to port 80 # External port can be customized ports: - 8337:80 volumes: - ./app-data:/app-data #+end_src Once the file is saved and closed, you can launch the container. #+begin_src sh cd ~/otterwiki sudo docker-compose up -d #+end_src The container is now available at =localhost:8337=. Next, we will use Nginx to serve this app externally. ** Nginx To access the app externally, let's set up a reverse proxy. I'll start by creating the Nginx configuration file for my wiki. #+begin_src sh sudo nano /etc/nginx/sites-available/wiki #+end_src Within the file, I have saved the following content. This assumes you already have a TLS/SSL cert to use with this subdomain. If not, simply remove the =ssl_*= variables, remove the =80= server block, and change the =443= server block to =80= to serve the app without SSL. #+begin_src conf server { if ($host ~ ^[^.]+\.example\.com$) { return 301 https://$host$request_uri; } listen [::]:80; listen 80; server_name wiki.example.com; return 404; } server { listen [::]:443 ssl http2; listen 443 ssl http2; server_name wiki.example.com; access_log /var/log/nginx/wiki.access.log; error_log /var/log/nginx/wiki.error.log; ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; include /etc/letsencrypt/options-ssl-nginx.conf; ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; location / { set $upstream_wiki http://127.0.0.1:8337; proxy_pass $upstream_wiki; proxy_set_header Host $http_host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Host $http_host; } } #+end_src Save and close the configuration file. On Nginx, we need to symlink the file to enable it. #+begin_src sh sudo ln -s /etc/nginx/sites-available/wiki /etc/nginx/sites-enabled/wiki #+end_src Once enabled, restart the Nginx server to start serving the app externally. #+begin_src sh sudo systemctl restart nginx.service #+end_src