summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTor Andersson <tor@ccxvii.net>2021-12-31 22:05:18 +0100
committerTor Andersson <tor@ccxvii.net>2021-12-31 22:24:47 +0100
commit1f060bf2ef8b3d475b0d37d32bab73e1a601ea11 (patch)
treed8aee9faff64c5690e1a4c3b21e99e6de443fcdb
parent119675c218c27a33d03ab2f01624486aec6ecdee (diff)
downloadserver-1f060bf2ef8b3d475b0d37d32bab73e1a601ea11.tar.gz
Parameterize site name and domain.
-rw-r--r--INSTALL.md62
-rw-r--r--LICENSE2
-rw-r--r--NOTES.md43
-rw-r--r--README.md3
-rw-r--r--schema.sql (renamed from tools/sql/schema.txt)0
-rw-r--r--server.js27
-rw-r--r--tools/sql/data.txt29
-rw-r--r--views/about.pug8
-rw-r--r--views/head.pug4
-rw-r--r--views/index.pug10
-rw-r--r--views/profile.pug4
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
+```
diff --git a/LICENSE b/LICENSE
index 78803fc..4f0a455 100644
--- a/LICENSE
+++ b/LICENSE
@@ -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
diff --git a/NOTES.md b/NOTES.md
index 51b622e..b9dd646 100644
--- a/NOTES.md
+++ b/NOTES.md
@@ -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/
-
diff --git a/README.md b/README.md
index 94a1ec6..6754935 100644
--- a/README.md
+++ b/README.md
@@ -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
diff --git a/server.js b/server.js
index 50fa751..e4b3802 100644
--- a/server.js
+++ b/server.js
@@ -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 &amp; 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}!