HOW TO HOST UR OWN LYPHE INSTANCE!! :D
niko vcs - real microsoft llc founder

asklyphe is structured in a way that should hopefully promote easy scaling
in the future, i.e. we can easily add more machines or better hardware to
our pre-existing machines and lyphe just becomes faster without any changes
to code.

because of this, we're using a stateless microservice architecture. that means
that core functionality is split into "services" which all do one kind of
task.

authservice handles authentication (and also anything that touches the postgres
database, might be changed in the future)

searchservice handles requests for searches, then compiles the results from the
search database and returns them.

etc.

the "stateless" part means that ideally, any service can be restarted and act
the exact same as if it were running continuously.
we don't store state in memory, and everything goes in databases.

all of this is to say that there's a reason that the architecture may at first
look a little complicated.

== MINIMUM VIABLE SETUP ==
this setup will get you an asklyphe setup that you can log into. you won't be
able to search for anything, but the website will generally start up and show
stuff.

you'll need:
- rust compiler
- nats-server binary (https://nats.io/)
- postgres server
- caddy (https://caddyserver.com/)
  (alternatively, some other webserver with reverse-proxy + static file hosting
  and willingness to convert our caddyfiles)

and the asklyphe services:
- authservice
  (https://forge.voremicrocomputers.com/asklyphe-public/authservice)
- asklyphe-frontend
  (https://forge.voremicrocomputers.com/asklyphe-public/asklyphe-frontend)
- asklyphe-auth-frontend
  (https://forge.voremicrocomputers.com/asklyphe-public/asklyphe-auth-frontend)

first, compile all the asklyphe services. should be as simple as running
`cargo build --release` (or without the --release flag if you want to debug)

secondly, you'll want to start up your postgres server and run the migrations
go to authservice/migration and run `cargo run -- up -u <postgres url>`
e.g. `cargo run -- up -u postgres://postgres:postgres@127.0.0.1/postgres`

thirdly, you'll want to start the nats server. just go to the directory
where you put nats-server and run `./nats-server -js`

finally, you can run each of the asklyphe service binaries you built.
they'll all need to have the following environment variables set:

RUST_LOG=<log level> (something like info or debug is good, this is optional)
NATS_URL="127.0.0.1:4222" (or whereever your nats server is)
NATS_KEY=<path to a pem keyfile> (used for nats tls, see below)
NATS_CERT=<path to a pem cert> (used for nats tls, see below)

KEY AND CERT ARE REQUIRED!!! however, you can use a dummy key and cert if you
don't feel like setting up tls on nats.

certain services need extra environment variables:

-- authservice --
DB_URL=<same postgres url as before>
SMTP_DISABLE=1 (or, see below)
SMTP_URL=<smtp url> (server must support starttls)
SMTP_USERNAME=<smtp username>
SMTP_PASSWORD=<smtp password>

-- asklyphe-auth-frontend --
ASKLYPHE_URL="http://127.0.0.1:8002" (alternatively, whatever url your instance
    is on)

-- asklyphe-frontend --
AUTH_URL="http://127.0.0.1:8001" (alternatively, whatever url your
    auth-frontend is on)

finally, you can run caddy with the caddyfile provided in the
asklyphe-auth-frontend git tree, and run all the services

you *hopefully* *should* be able to connect to https://127.0.0.1:8002 and see
the asklyphe homepage! insert an invite code into the database and you can
create an account!

== ADDING SOME SEARCH SERVICES ==

bingservice and googleservice should be fine by just compiling and running
without anything other than the NATS_* environment variables, however
running searchservice will take a bit more work

searchservice requires a foundationdb instance be running, specifically version
7.1.3 (will be changed in the future once we move to our own database system)

once you follow the setup instructions at https://www.foundationdb.org/ you
should be good to go (foundationdb uses a file in /etc to authenticate,
no envvars needed)

that should be all that's needed! there's probably stuff i'm forgetting so i'll
update this file as needed
