dnote/SELF_HOSTING.md

183 lines
5 KiB
Markdown

# Installing Dnote Server
This guide documents the steps for installing the Dnote server on your own machine. If you prefer Docker, please see [the Docker guide](https://github.com/dnote/dnote/blob/master/host/docker/README.md).
## Overview
Dnote server comes as a single binary file that you can simply download and run. It uses Postgres as the database.
## Installation
1. Install Postgres 11+.
2. Create a `dnote` database by running `createdb dnote`
3. Download the official Dnote server release from the [release page](https://github.com/dnote/dnote/releases).
4. Extract the archive and move the `dnote-server` executable to `/usr/local/bin`.
```bash
tar -xzf dnote-server-$version-$os.tar.gz
mv ./dnote-server /usr/local/bin
```
4. Run Dnote
```bash
GO_ENV=PRODUCTION \
OnPremise=true \
DBHost=localhost \
DBPort=5432 \
DBName=dnote \
DBUser=$user \
DBPassword=$password \
WebURL=$webURL \
SmtpHost=$SmtpHost \
SmtpPort=$SmtpPort \
SmtpUsername=$SmtpUsername \
SmtpPassword=$SmtpPassword \
DisableRegistration=false
dnote-server start
```
Replace `$user`, `$password` with the credentials of the Postgres user that owns the `dnote` database.
Replace `$webURL` with the full URL to your server, without a trailing slash (e.g. `https://your.server`).
Replace `$SmtpHost`, `SmtpPort`, `$SmtpUsername`, `$SmtpPassword` with actual values, if you would like to receive spaced repetition through email.
Replace `DisableRegistration` to `true` if you would like to disable user registrations.
By default, dnote server will run on the port 3000.
## Configuration
By now, Dnote is fully functional in your machine. The API, frontend app, and the background tasks are all in the single binary. Let's take a few more steps to configure Dnote.
### Configure Nginx
To make it accessible from the Internet, you need to configure Nginx.
1. Install nginx.
2. Create a new file in `/etc/nginx/sites-enabled/dnote` with the following contents:
```
server {
server_name my-dnote-server.com;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:3000;
}
}
```
3. Replace `my-dnote-server.com` with the URL for your server.
4. Reload the nginx configuration by running the following:
```
sudo service nginx reload
```
### Configure Apache2
1. Install Apache2 and install/enable mod_proxy.
2. Create a new file in `/etc/apache2/sites-available/dnote.conf` with the following contents:
```
<VirtualHost *:80>
ServerName notes.example.com
ProxyRequests Off
ProxyPreserveHost On
ProxyPass / http://127.0.0.1:3000/ keepalive=On
ProxyPassReverse / http://127.0.0.1:3000/
RequestHeader set X-Forwarded-HTTPS "0"
</VirtualHost>
```
3. Enable the dnote site and restart the Apache2 service by running the following:
```
a2ensite dnote
sudo service apache2 restart
```
Now you can access the Dnote frontend application on `/`, and the API on `/api`.
### Configure TLS by using LetsEncrypt
It is recommended to use HTTPS. Obtain a certificate using LetsEncrypt and configure TLS in Nginx.
In the future versions of the Dnote Server, HTTPS will be required at all times.
### Run Dnote As a Daemon
We can use `systemd` to run Dnote in the background as a Daemon, and automatically start it on system reboot.
1. Create a new file at `/etc/systemd/system/dnote.service` with the following content:
```
[Unit]
Description=Starts the dnote server
Requires=network.target
After=network.target
[Service]
Type=simple
User=$user
Restart=always
RestartSec=3
WorkingDirectory=/home/$user
ExecStart=/usr/local/bin/dnote-server start
Environment=GO_ENV=PRODUCTION
Environment=OnPremise=true
Environment=DBHost=localhost
Environment=DBPort=5432
Environment=DBName=dnote
Environment=DBUser=$DBUser
Environment=DBPassword=$DBPassword
Environment=DBSkipSSL=true
Environment=WebURL=$WebURL
Environment=SmtpHost=
Environment=SmtpPort=
Environment=SmtpUsername=
Environment=SmtpPassword=
[Install]
WantedBy=multi-user.target
```
Replace `$user`, `$WebURL`, `$DBUser`, and `$DBPassword` with the actual values.
Optionally, if you would like to send spaced repetitions throught email, populate `SmtpHost`, `SmtpPort`, `SmtpUsername`, and `SmtpPassword`.
2. Reload the change by running `sudo systemctl daemon-reload`.
3. Enable the Daemon by running `sudo systemctl enable dnote`.`
4. Start the Daemon by running `sudo systemctl start dnote`
### Configure clients
Let's configure Dnote clients to connect to the self-hosted web API endpoint.
#### CLI
We need to modify the configuration file for the CLI. It should have been generated at `~/.dnote/dnoterc` upon running the CLI for the first time.
The following is an example configuration:
```yaml
editor: nvim
apiEndpoint: https://api.getdnote.com
```
Simply change the value for `apiEndpoint` to a full URL to the self-hosted instance, followed by '/api', and save the configuration file.
e.g.
```yaml
editor: nvim
apiEndpoint: my-dnote-server.com/api
```
#### Browser extension
Navigate into the 'Settings' tab and set the values for 'API URL', and 'Web URL'.