diff options
-rw-r--r-- | INSTALL.md | 62 | ||||
-rw-r--r-- | LICENSE | 2 | ||||
-rw-r--r-- | NOTES.md | 43 | ||||
-rw-r--r-- | README.md | 3 | ||||
-rw-r--r-- | schema.sql (renamed from tools/sql/schema.txt) | 0 | ||||
-rw-r--r-- | server.js | 27 | ||||
-rw-r--r-- | tools/sql/data.txt | 29 | ||||
-rw-r--r-- | views/about.pug | 8 | ||||
-rw-r--r-- | views/head.pug | 4 | ||||
-rw-r--r-- | views/index.pug | 10 | ||||
-rw-r--r-- | views/profile.pug | 4 |
11 files changed, 95 insertions, 97 deletions
diff --git a/INSTALL.md b/INSTALL.md new file mode 100644 index 0000000..1d1ecba --- /dev/null +++ b/INSTALL.md @@ -0,0 +1,62 @@ +## Setting up the server + +All data is stored in an SQLite3 database. + +The server and game rules are implemented in Javascript. +The game state is stored in the database as a JSON blob. +The server runs on Node with the Express.js and Socket.io frameworks. + +Check out the game submodules: + +``` +git clone https://github.com/rally-the-troops/julius-caesar.git public/julius-caesar +``` + +Initialize the database: + +``` +sqlite3 db < schema.sql +sqlite3 db < public/julius-caesar/title.sql +``` + +Redirect port 80 and 443 to 8080 and 8443: + +``` +sudo iptables -A PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-ports 8080 +sudo iptables -A PREROUTING -t nat -p tcp --dport 443 -j REDIRECT --to-ports 8443 +``` + +Create SSL certificate with Let's Encrypt certbot, or self-signed with OpenSSL: + +``` +openssl req -nodes -new -x509 -keyout key.pem -out cert.pem +``` + +Configure the server using the .env file: + +``` +NODE_ENV=production + +SITE_NAME=YOUR_SITE_NAME +SITE_URL=https://YOUR_DOMAIN + +HTTP_PORT=8080 + +HTTPS_PORT=8443 +SSL_KEY=/etc/letsencrypt/live/YOUR_DOMAIN/privkey.com +SSL_CERT=/etc/letsencrypt/live/YOUR_DOMAIN/fullchain.pem + +MAIL_FROM=YOUR_SITE_NAME <notifications@YOUR_DOMAIN> +MAIL_HOST=localhost +MAIL_PORT=25 +``` + +If the HTTPS_PORT is missing, the server will only serve HTTP. + +If MAIL_HOST/PORT/FROM are not present, the server will not send notification emails. + +Start the server: + +``` +node server.js +``` @@ -10,7 +10,7 @@ game titles. ISC License -Copyright 2021 Tor Andersson +Copyright 2021, 2022 Tor Andersson Permission to use, copy, modify, and/or distribute this software for any purpose with or without fee is hereby granted, provided that the above @@ -1,45 +1,3 @@ -## Setting up the server - -All data is stored in an SQLite3 database. - -The server and game rules are implemented in Javascript. -The game state is stored in the database as a JSON blob. -The server runs on Node with the Express.js and Socket.io frameworks. - -Redirect port 80 and 443 to 8080 and 8443: - -``` -sudo iptables -A PREROUTING -t nat -p tcp --dport 80 -j REDIRECT --to-ports 8080 -sudo iptables -A PREROUTING -t nat -p tcp --dport 443 -j REDIRECT --to-ports 8443 -``` - -Create SSL certificate with Let's Encrypt certbot, or self-signed with OpenSSL: - -``` -openssl req -nodes -new -x509 -keyout key.pem -out cert.pem -``` - -Configure the server using the .env file: - -``` -NODE_ENV=production - -HTTP_PORT=8080 - -HTTPS_PORT=8443 -SSL_KEY=/etc/letsencrypt/live/YOUR_DOMAIN/privkey.com -SSL_CERT=/etc/letsencrypt/live/YOUR_DOMAIN/fullchain.pem - -MAIL_FROM="Your Site Name <notifications@YOUR_DOMAIN>" -MAIL_HOST=localhost -MAIL_PORT=25 -``` - -If the HTTPS_PORT is missing, the server will only serve HTTP. -If MAIL_HOST/PORT are not present, the server will not send notification emails. - -## Resources - Icons are sourced from various places: * https://game-icons.net/ @@ -58,4 +16,3 @@ Image processing software: * https://github.com/svg/svgo * http://optipng.sourceforge.net/ * http://potrace.sourceforge.net/ - @@ -2,7 +2,8 @@ ## About -Rally the Troops! is an open source website for playing historical games. +Rally the Troops! is website for playing historical board games. + All titles are published on rally-the-troops.com with permission from their respective designers and/or publishers. If you intend to use any title for your own use or on a different website, please contact the applicable designer diff --git a/tools/sql/schema.txt b/schema.sql index 419da0d..419da0d 100644 --- a/tools/sql/schema.txt +++ b/schema.sql @@ -11,6 +11,9 @@ const sqlite3 = require('better-sqlite3'); require('dotenv').config(); +const SITE_URL = process.env.SITE_URL || "http://localhost:8080"; +const SITE_NAME = process.env.SITE_NAME || "Untitled"; + /* * Main database. */ @@ -29,7 +32,7 @@ function SQL(s) { */ let mailer = null; -if (process.env.MAIL_HOST && process.env.MAIL_PORT) { +if (process.env.MAIL_HOST && process.env.MAIL_PORT && process.env.MAIL_FROM) { mailer = require('nodemailer').createTransport({ host: process.env.MAIL_HOST, port: process.env.MAIL_PORT, @@ -93,6 +96,7 @@ app.set('view engine', 'pug'); app.use(compression()); app.use(express.static('public', { etag: false, cacheControl: false, setHeaders: set_static_headers })); app.use(express.urlencoded({extended:false})); +app.locals.SITE_NAME = SITE_NAME; let http_port = process.env.HTTP_PORT || 8080; let http_server = http.createServer(app); @@ -1381,8 +1385,8 @@ app.get('/:title_id/play\::game_id', function (req, res) { * MAIL NOTIFICATIONS */ -const MAIL_FROM = process.env.MAIL_FROM || "Rally the Troops! <notifications@rally-the-troops.com>"; -const MAIL_FOOTER = "You can unsubscribe from notifications on your profile page:\nhttps://rally-the-troops.com/profile\n"; +const MAIL_FROM = process.env.MAIL_FROM || "user@localhost"; +const MAIL_FOOTER = `You can unsubscribe from notifications on your profile page:\n${SITE_URL}/profile\n`; const SQL_SELECT_NOTIFIED = SQL("SELECT datetime('now') < datetime(time,?) FROM last_notified WHERE game_id=? AND user_id=?").pluck(); const SQL_INSERT_NOTIFIED = SQL("INSERT OR REPLACE INTO last_notified (game_id,user_id,time) VALUES (?,?,datetime('now'))"); @@ -1409,14 +1413,17 @@ function mail_describe(game) { } function mail_password_reset_token(user, token) { - let subject = "Rally the Troops - Password reset request"; + let subject = "Password reset request"; let body = "Your password reset token is: " + token + "\n\n" + - "https://rally-the-troops.com/reset-password/" + user.mail + "/" + token + "\n\n" + + SITE_URL + "/reset-password/" + user.mail + "/" + token + "\n\n" + "If you did not request a password reset you can ignore this mail.\n"; - console.log("SENT MAIL:", mail_addr(user), subject); - if (mailer) + if (mailer) { + console.log("SENT MAIL:", mail_addr(user), subject); mailer.sendMail({ from: MAIL_FROM, to: mail_addr(user), subject: subject, text: body }, mail_callback); + } else { + console.log("DID NOT SEND MAIL:", mail_addr(user), subject); + } } function mail_new_message(user, msg_id, msg_from, msg_subject, msg_body) { @@ -1424,7 +1431,7 @@ function mail_new_message(user, msg_id, msg_from, msg_subject, msg_body) { let body = "Subject: " + msg_subject + "\n\n" + msg_body + "\n\n--\n" + "You can reply to this message at:\n" + - "https://rally-the-troops.com/message/read/" + msg_id + "\n\n"; + SITE_URL + "/message/read/" + msg_id + "\n\n"; console.log("SENT MAIL:", mail_addr(user), subject); if (mailer) mailer.sendMail({ from: MAIL_FROM, to: mail_addr(user), subject: subject, text: body }, mail_callback); @@ -1438,7 +1445,7 @@ function mail_your_turn_notification(user, game_id, interval) { let subject = game.title_name + " - " + game_id + " - Your turn!"; let body = mail_describe(game) + "It's your turn.\n\n" + - "https://rally-the-troops.com/play/" + game_id + "\n\n--\n" + + SITE_URL + "/play/" + game_id + "\n\n--\n" + MAIL_FOOTER; console.log("SENT MAIL:", mail_addr(user), subject); if (mailer) @@ -1458,7 +1465,7 @@ function mail_ready_to_start_notification(user, game_id, interval) { let subject = game.title_name + " - " + game_id + " - Ready to start!"; let body = mail_describe(game) + "Your game is ready to start.\n\n" + - "https://rally-the-troops.com/join/" + game_id + "\n\n--\n" + + SITE_URL + "/join/" + game_id + "\n\n--\n" + MAIL_FOOTER; console.log("SENT MAIL:", mail_addr(user), subject); if (mailer) diff --git a/tools/sql/data.txt b/tools/sql/data.txt deleted file mode 100644 index e9fc882..0000000 --- a/tools/sql/data.txt +++ /dev/null @@ -1,29 +0,0 @@ -PRAGMA foreign_keys=0; - -INSERT OR REPLACE INTO titles VALUES ( '300-earth-and-water', '300: Earth & Water', 267058, 0 ); -INSERT OR REPLACE INTO roles VALUES ( '300-earth-and-water', 'Persia' ); -INSERT OR REPLACE INTO roles VALUES ( '300-earth-and-water', 'Greece' ); - -INSERT OR REPLACE INTO titles VALUES ( 'crusader-rex', 'Crusader Rex', 8481, 0 ); -INSERT OR REPLACE INTO roles VALUES ( 'crusader-rex', 'Franks' ); -INSERT OR REPLACE INTO roles VALUES ( 'crusader-rex', 'Saracens' ); - -INSERT OR REPLACE INTO titles VALUES ( 'julius-caesar', 'Julius Caesar', 37836, 0 ); -INSERT OR REPLACE INTO roles VALUES ( 'julius-caesar', 'Caesar' ); -INSERT OR REPLACE INTO roles VALUES ( 'julius-caesar', 'Pompeius' ); - -INSERT OR REPLACE INTO titles VALUES ( 'hammer-of-the-scots', 'Hammer of the Scots', 3685, 0 ); -INSERT OR REPLACE INTO roles VALUES ( 'hammer-of-the-scots', 'England' ); -INSERT OR REPLACE INTO roles VALUES ( 'hammer-of-the-scots', 'Scotland' ); - -INSERT OR REPLACE INTO titles VALUES ( 'richard-iii', 'Richard III', 25277, 0 ); -INSERT OR REPLACE INTO roles VALUES ( 'richard-iii', 'York' ); -INSERT OR REPLACE INTO roles VALUES ( 'richard-iii', 'Lancaster' ); - -INSERT OR REPLACE INTO titles VALUES ( 'shores-of-tripoli', 'Shores of Tripoli', 237860, 0 ); -INSERT OR REPLACE INTO roles VALUES ( 'shores-of-tripoli', 'Tripolitania' ); -INSERT OR REPLACE INTO roles VALUES ( 'shores-of-tripoli', 'United States' ); - -INSERT OR REPLACE INTO titles VALUES ( 'wilderness-war', 'Wilderness War', 1822, 1 ); -INSERT OR REPLACE INTO roles VALUES ( 'wilderness-war', 'French' ); -INSERT OR REPLACE INTO roles VALUES ( 'wilderness-war', 'British' ); diff --git a/views/about.pug b/views/about.pug index 2a0a9a2..fabc580 100644 --- a/views/about.pug +++ b/views/about.pug @@ -3,17 +3,17 @@ doctype html html head include head - title Rally the Troops! + title= SITE_NAME style. li img { height: 1.0em; vertical-align: middle; } body include header article - h1 Rally the Troops! + h1= SITE_NAME - p Rally the Troops! is created and maintained by Tor Andersson. It is an open source project. + p Rally the Troops! is created and maintained by Tor Andersson. It is a free software project. - p Please submit problem reports and make suggestions for improvements on #[a(href="https://github.com/ccxvii/rally-the-troops/issues") GitHub]. + p Please submit problem reports and make suggestions for improvements on #[a(href="https://github.com/rally-the-troops/") GitHub]. h2 Tips & Tricks diff --git a/views/head.pug b/views/head.pug index 3c65c23..68fa904 100644 --- a/views/head.pug +++ b/views/head.pug @@ -9,9 +9,9 @@ mixin social(title,description,game) meta(property="og:title" content=title) meta(property="og:type" content="website") if game - meta(property="og:image" content="https://rally-the-troops.com/"+game+"/cover.2x.jpg") + meta(property="og:image" content=SITE_URL+"/"+game+"/cover.2x.jpg") else - meta(property="og:image" content="https://rally-the-troops.com/images/rally-the-troops.png") + meta(property="og:image" content=SITE_URL+"/images/rally-the-troops.png") meta(property="og:description" content=description) mixin gamecover(title_id) diff --git a/views/index.pug b/views/index.pug index 98d5ef7..ec07e03 100644 --- a/views/index.pug +++ b/views/index.pug @@ -3,9 +3,9 @@ doctype html html head include head - +social("Rally the Troops!", "Play historic board games on the web.") + +social(SITE_NAME, "Play historic board games on the web.") meta(name="keywords" content="wargames, war games, block games") - title Rally the Troops! + title= SITE_NAME style. div.list { max-width: 800px; @@ -31,9 +31,9 @@ html body include header article - h1 Rally the Troops! + h1= SITE_NAME - p Rally the Troops! is a website where you can play historic board games online. + p #{SITE_NAME} is a website where you can play historic board games online. p Registration and use is free, and there are no ads. @@ -47,4 +47,4 @@ html p: a(href="/games") List of all open and active games. - p Join the #[a(href="https://discord.gg/CBrTh8k84A") Discord] server to find players or report bugs. + p!= process.env.SITE_INVITE diff --git a/views/profile.pug b/views/profile.pug index 77cc597..6fb777a 100644 --- a/views/profile.pug +++ b/views/profile.pug @@ -3,13 +3,13 @@ doctype html html head include head - title Rally the Troops! + title= SITE_NAME if active_games.length > 0 meta(http-equiv="refresh" content=300) body include header article - h1 Rally the Troops! + h1= SITE_NAME a(href="https://gravatar.com/"): img.avatar(src=avatar) p Welcome, #{user.name}! |