diff --git a/README.md b/README.md
index f66539372..5059c8646 100644
--- a/README.md
+++ b/README.md
@@ -99,6 +99,45 @@ For detailed guides on self-hosting Puter, including configuration options and b
+### ๐ Installation on public server
+Subdomain is puter. Replace "domain.com" with your domain name.
+
+#### -Create DNS entries for puter.domain.com and api.puter.domain.com, both pointing to the same IP.
+
+#### -Create apache domain configs for puter.domain.com and api.puter.domain.com and add reverse proxy entries for both subdomains
+```$ a2enmod proxy```
+```$ a2enmod proxy_http```
+
+
+##### /etc/apache/sites-enabled/--configfile---
+```
+ProxyPass / http://localhost:4100/
+ProxyPassReverse / http://localhost:4100/
+```
+#### -Edit ./src/backend/src/config.js
+Add after ```let config = {};```
+```
+config.api_base_url = 'https://api.puter.domain.com';
+config.origin='https://puter.domain.com';
+config.http_port=443;ยด
+config.pub_port=443;
+config.protocol='https';
+```
+
+#### -Edit ./node_modules/@heyputer/backend/src/services/WebServerService.js and ./src/backend/src/services/WebServerService.js
+Search for
+```if (allowedDomains.some(allowedDomain => hostName ===```
+and change the line to
+```if (allowedDomains.some(allowedDomain => hostName === "puter.domain.com" || hostName.endsWith('.' + allowedDomain))) {```
+
+#### -Edit ./volatile/config/config.json
+Change ```"domain": "puter.localhost"``` to ```"domain": "puter.domain.com"```
+
+#### -Run sed to replace the domain in all remaining files
+``` grep -rl "puter.localhost:4100" . | xargs sed -i 's/puter.localhost:4001/puter.domain.com/g' ```
+
+
+
### โ๏ธ Puter.com
Puter is available as a hosted service at [**puter.com**](https://puter.com).
diff --git a/src/backend/src/routers/signup.js b/src/backend/src/routers/signup.js
index f061d66d5..fd5cb6c97 100644
--- a/src/backend/src/routers/signup.js
+++ b/src/backend/src/routers/signup.js
@@ -66,6 +66,10 @@ module.exports = eggspress(['/signup'], {
body: req.body,
});
+ if( config.registration_closed == true ) {
+ return res.status(403).send('Registration is closed.');
+ }
+
// check bot trap, if `p102xyzname` is anything but an empty string it means
// that a bot has filled the form
// doesn't apply to temp users
@@ -228,7 +232,7 @@ module.exports = eggspress(['/signup'], {
'UPDATE `user` SET `last_activity_ts` = now() WHERE id=? LIMIT 1',
[insert_res.insertId]
);
-
+
// TODO: cache group id
const svc_group = req.services.get('group');
await svc_group.add_users({
@@ -348,5 +352,5 @@ module.exports = eggspress(['/signup'], {
taskbar_items: await get_taskbar_items(user),
referral_code,
}
- })
+ })
});