summaryrefslogtreecommitdiff
path: root/doc/LEGACY_INSTALL.md
diff options
context:
space:
mode:
authorShyam Sunder <sgsunder1@gmail.com>2019-08-05 19:15:37 -0400
committerShyam Sunder <sgsunder1@gmail.com>2019-08-05 19:20:41 -0400
commit48e7eb10f1bc06fb07b8b14c91b036a12fbe367d (patch)
tree68c4b07a2b6ceaae55609ed11d30ad374b1e9289 /doc/LEGACY_INSTALL.md
parent69922fccb68d65f4cabba03b04bb2c6b7c5acde6 (diff)
doc: moved documentation to a seperate folder
Diffstat (limited to 'doc/LEGACY_INSTALL.md')
-rw-r--r--doc/LEGACY_INSTALL.md237
1 files changed, 237 insertions, 0 deletions
diff --git a/doc/LEGACY_INSTALL.md b/doc/LEGACY_INSTALL.md
new file mode 100644
index 0000000..1e667de
--- /dev/null
+++ b/doc/LEGACY_INSTALL.md
@@ -0,0 +1,237 @@
+**This installation guide is deprecated and might be out of date!
+It is recommended that you deploy using [Docker](INSTALL.md) instead.**
+
+This guide assumes Arch Linux. Although exact instructions for other
+distributions are different, the steps stay roughly the same.
+
+### Installing hard dependencies
+
+Szurubooru requires the following dependencies:
+- Python (3.5 or later)
+- Postgres
+- FFmpeg
+- node.js
+
+```console
+user@host:~$ sudo pacman -S postgresql
+user@host:~$ sudo pacman -S python
+user@host:~$ sudo pacman -S python-pip
+user@host:~$ sudo pacman -S ffmpeg
+user@host:~$ sudo pacman -S npm
+user@host:~$ sudo pacman -S elasticsearch
+user@host:~$ sudo pip install virtualenv
+user@host:~$ python --version
+Python 3.5.1
+```
+
+The reason `ffmpeg` is used over, say, `ImageMagick` or even `PIL` is because of
+Flash and video posts.
+
+
+
+### Setting up a database
+
+First, basic `postgres` configuration:
+
+```console
+user@host:~$ sudo -i -u postgres initdb --locale en_US.UTF-8 -E UTF8 -D /var/lib/postgres/data
+user@host:~$ sudo systemctl start postgresql
+user@host:~$ sudo systemctl enable postgresql
+```
+
+Then creating a database:
+
+```console
+user@host:~$ sudo -i -u postgres createuser --interactive
+Enter name of role to add: szuru
+Shall the new role be a superuser? (y/n) n
+Shall the new role be allowed to create databases? (y/n) n
+Shall the new role be allowed to create more new roles? (y/n) n
+user@host:~$ sudo -i -u postgres createdb szuru
+user@host:~$ sudo -i -u postgres psql -c "ALTER USER szuru PASSWORD 'dog';"
+```
+
+
+
+### Setting up elasticsearch
+
+```console
+user@host:~$ sudo systemctl start elasticsearch
+user@host:~$ sudo systemctl enable elasticsearch
+```
+
+### Preparing environment
+
+Getting `szurubooru`:
+
+```console
+user@host:~$ git clone https://github.com/rr-/szurubooru.git szuru
+user@host:~$ cd szuru
+```
+
+Installing frontend dependencies:
+
+```console
+user@host:szuru$ cd client
+user@host:szuru/client$ npm install
+```
+
+`npm` sandboxes dependencies by default, i.e. installs them to
+`./node_modules`. This is good, because it avoids polluting the system with the
+project's dependencies. To make Python work the same way, we'll use
+`virtualenv`. Installing backend dependencies with `virtualenv` looks like
+this:
+
+```console
+user@host:szuru/client$ cd ../server
+user@host:szuru/server$ virtualenv python_modules # consistent with node_modules
+user@host:szuru/server$ source python_modules/bin/activate # enters the sandbox
+(python_modules) user@host:szuru/server$ pip install -r requirements.txt # installs the dependencies
+```
+
+
+
+### Preparing `szurubooru` for first run
+
+1. Compile the frontend:
+
+ ```console
+ user@host:szuru$ cd client
+ user@host:szuru/client$ node build.js
+ ```
+
+ You can include the flags `--no-transpile` to disable the JavaScript
+ transpiler, which provides compatibility with older browsers, and
+ `--debug` to generate JS source mappings.
+
+2. Configure things:
+
+ ```console
+ user@host:szuru/client$ cd ..
+ user@host:szuru$ mv server/config.yaml.dist .
+ user@host:szuru$ cp config.yaml.dist config.yaml
+ user@host:szuru$ vim config.yaml
+ ```
+
+ Pay extra attention to these fields:
+
+ - data directory,
+ - data URL,
+ - database,
+ - the `smtp` section.
+
+3. Upgrade the database:
+
+ ```console
+ user@host:szuru/client$ cd ../server
+ user@host:szuru/server$ source python_modules/bin/activate
+ (python_modules) user@host:szuru/server$ alembic upgrade head
+ ```
+
+ `alembic` should have been installed during installation of `szurubooru`'s
+ dependencies.
+
+4. Run the tests:
+
+ ```console
+ (python_modules) user@host:szuru/server$ pytest
+ ```
+
+It is recommended to rebuild the frontend after each change to configuration.
+
+
+
+### Wiring `szurubooru` to the web server
+
+`szurubooru` is divided into two parts: public static files, and the API. It
+tries not to impose any networking configurations on the user, so it is the
+user's responsibility to wire these to their web server.
+
+The static files are located in the `client/public/data` directory and are
+meant to be exposed directly to the end users.
+
+The API should be exposed using WSGI server such as `waitress`, `gunicorn` or
+similar. Other configurations might be possible but I didn't pursue them.
+
+API calls are made to the relative URL `/api/`. Your HTTP server should be
+configured to proxy this URL format to the WSGI server. Some users may prefer
+to use a dedicated reverse proxy for this, to incorporate additional features
+such as load balancing and SSL.
+
+Note that the API URL in the virtual host configuration needs to be the same as
+the one in the `config.yaml`, so that client knows how to access the backend!
+
+#### Example
+
+In this example:
+
+- The booru is accessed from `http://example.com/`
+- The API is accessed from `http://example.com/api`
+- The API server listens locally on port 6666, and is proxied by nginx or apache
+- The static files are served from `/srv/www/booru/client/public/data`
+
+You can use either nginx or apache to serve your static content and proxy the api server.
+Choose whichever you prefer, but don't use both.
+
+**nginx configuration**:
+
+```nginx
+server {
+ listen 80;
+ server_name example.com;
+
+ location ~ ^/api$ {
+ return 302 /api/;
+ }
+ location ~ ^/api/(.*)$ {
+ if ($request_uri ~* "/api/(.*)") { # preserve PATH_INFO as-is
+ proxy_pass http://127.0.0.1:6666/$1;
+ }
+ }
+ location / {
+ root /srv/www/booru/client/public;
+ try_files $uri /index.htm;
+ }
+}
+```
+
+**apache configuration**:
+
+```apache
+<VirtualHost *:80>
+ ServerName example.com
+
+ Redirect 302 /api /api/
+
+ ProxyPreserveHost On
+ ProxyPass /api/ http://127.0.0.1:6666/
+ ProxyPassReverse /api/ http://127.0.0.1:6666/
+
+ DocumentRoot "/srv/www/booru/client/public"
+ FallbackResource /index.htm
+ AllowEncodedSlashes On
+</VirtualHost>
+```
+
+**`config.yaml`**:
+
+```yaml
+data_url: 'http://example.com/data/'
+data_dir: '/srv/www/booru/client/public/data'
+```
+
+To run the server using `waitress`:
+
+```console
+user@host:szuru/server$ source python_modules/bin/activate
+(python_modules) user@host:szuru/server$ pip install waitress
+(python_modules) user@host:szuru/server$ waitress-serve --port 6666 szurubooru.facade:app
+```
+
+or `gunicorn`:
+
+```console
+user@host:szuru/server$ source python_modules/bin/activate
+(python_modules) user@host:szuru/server$ pip install gunicorn
+(python_modules) user@host:szuru/server$ gunicorn szurubooru.facade:app -b 127.0.0.1:6666
+```