An API + webapp to manage PSForever accounts, characters, and servers.
- User registration, login, and sessions
- Home page
- Admin management
- Email verification + captcha
- Changing passwords
- WorldServer mangement
This requires a relatively modern version of Node that supports async/await and ES6 (v13.x+). Tested using v13.3.0. Do not use LTS builds. You may still get (node:61412) ExperimentalWarning: The ESM module loader is experimental.
. Ignore this as ESM is essentially stable in recent versions.
Windows users: Before continuing, run npm install --global --production windows-build-tools
. Otherwise, bcrypt
won't install properly.
First download and install the Node dependencies:
git clone https://github.com/psforever/PSFPortal
cd PSFPortal/
npm install
You should see no errors (warnings are okay).
Next, install PostgreSQL from your package manager or the following links:
- Windows - Official Downloads
- Linux - Debian or Ubuntu
- macOS - Application https://www.postgresql.org/download/ (or
brew install postgresql && brew services start postgresql
)
Create a database named psforever
using psql
or a graphical tool such as pgAdmin (highly recommended).
Then create a user named psforever
with a password of psforever
and GRANT
it access to the psforever
database, public tables, and public sequences.
This can be summarized with the following raw SQL commands:
CREATE USER psforever;
CREATE DATABASE psforever;
GRANT ALL PRIVILEGES ON DATABASE psforever TO psforever;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO psforever;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO psforever;
ALTER USER psforever WITH PASSWORD 'psforever';
Load the DB schema into the database using the command line:
psql psforever < db/schema.sql
Or the pgAdmin's "Query Tool" interface.
Before running, you will need to create a .env
file in the root of the project like this:
PGUSER=your_database_user
PGHOST=localhost
PGPASSWORD=your_database_user_password
PSADMIN="127.0.0.1:51002"
PGDATABASE=psforever
PGPORT=5432
COOKIE_SECRET=make_this_very_long_and_random
Never share/release/commit your .env
file.
Now run the following command:
# Will start the backend server (:8080) and webpack
npm run dev
You should see similar output:
> psfportal@1.0.0 dev /home/chord/PSFPortal
> concurrently --kill-others "npm run dev-server" "npm run webpack"
[1]
[1] > psfportal@1.0.0 webpack /home/chord/PSFPortal
[1] > webpack-dev-server --history-api-fallback --config webpack.config.cjs --content-base public
[1]
[0]
[0] > psfportal@1.0.0 dev-server /home/chord/PSFPortal
[0] > nodemon -w api/ -w index.js
[0]
[0] [nodemon] 2.0.2
[0] [nodemon] to restart at any time, enter `rs`
[0] [nodemon] watching dir(s): api/**/* index.js
[0] [nodemon] watching extensions: js,mjs,json
[0] [nodemon] starting `node index.js`
[0] (node:16193) ExperimentalWarning: The ESM module loader is experimental.
[0] WARNING: development server simulated delay active
[0] Trusting proxy
[0] Connected to the psql database at localhost
[0] Starting PSAdmin polling for 127.0.0.1:51002
[0] [MODE development] PSFWeb now accepting requests at http://localhost:8080/
[1] ℹ 「wds」: Project is running at http://dev.psforever.net:8081/
[1] ℹ 「wds」: webpack output is served from /
[1] ℹ 「wds」: Content not from webpack is served from /home/chord/PSFPortal/public
[1] ℹ 「wds」: 404s will fallback to /index.html
[1] ℹ 「wdm」: Hash: 72b56958125b6abdf96c
[1] Version: webpack 4.41.5
[1] Time: 4493ms
[1] Built at: 05/12/2020 11:44:23 PM
[1] Asset Size Chunks Chunk Names
[1] bundle.js 2.1 MiB bundle [emitted] bundle
[1] bundle.js.map 2.23 MiB bundle [emitted] [dev] bundle
[1] Entrypoint bundle = bundle.js bundle.js.map
[1] [1] multi (webpack)-dev-server/client?http://dev.psforever.net:8081 ./app/main.js 40 bytes {bundle} [built]
[1] [./app/App.svelte] 14.5 KiB {bundle} [built]
<snip>
[1] ℹ 「wdm」: Compiled successfully.
> psfportal@1.0.0 dev-server
> nodemon -w api/ -w index.js
[nodemon] 2.0.2
[nodemon] to restart at any time, enter `rs`
[nodemon] watching dir(s): api/**/* index.js
[nodemon] watching extensions: js,mjs,json
[nodemon] starting `node index.js`
(node:25327) ExperimentalWarning: The ESM module loader is experimental.
WARNING: development server simulated delay active
Connected to the psql database at localhost
[MODE development] PSFWeb now accepting requests at http://localhost:8080/
Please note that Webpack (dev) will proxy all API requests (/api) to the host http://localhost:8080
(see the devServer
key in webpack.config.cjs). This MUST match your backend server's (dev-server) listening port, which is by default 8080.
Finally, connect to http://localhost:8081 (webpack, not the raw express server)
Register an account to start and grant it GM privileges using UPDATE accounts SET gm=true WHERE id=your_id
.
- Database SELECT/INSERTs are failing, but I can connect to the DB
Make sure you have granted the right permissions to your DB user.
GRANT ALL PRIVILEGES ON DATABASE user TO dbname;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO user;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO user;
[HPM] Error occurred while trying to proxy request /api/stats from localhost:8080 to http://localhost:8080
Your Webpack instance is listening on 8080, when it should be listening on 8081 and proxying to the express server at 8080. Make sure to run npm run dev-server
first and make sure it ran properly.
Error: Cannot find package 'bcrypt'
The bcrypt
package has native dependencies that must match your Node version. If you upgrade Node, they will be outdated. To fix this, you need to remove your node_modules/
directory and run npm install
again to kick off another native build of this dependency.
Follow the same steps as above, but instead run npm run production
at the very end.