update services information, .env verification, update privacy policy, add git to home links, linting and minor rewording in readme, update guides styling
This commit is contained in:
parent
2469ca5a79
commit
9bf1532e34
42
README.md
42
README.md
@ -1,69 +1,95 @@
|
|||||||
# pontus-mail
|
# pontus-mail
|
||||||
[](#)
|
|
||||||
|
[](https://github.com/ihatenodejs/pontus-mail)
|
||||||
[](http://creativecommons.org/publicdomain/zero/1.0/)
|
[](http://creativecommons.org/publicdomain/zero/1.0/)
|
||||||
|
|
||||||
Landing page for p0ntus mail
|
Landing page for p0ntus mail
|
||||||
# Self hosting
|
|
||||||
## Traditional Node.js
|
## Self hosting
|
||||||
|
|
||||||
|
### Using Express
|
||||||
|
|
||||||
1. Clone the repo
|
1. Clone the repo
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/ihatenodejs/pontus-mail.git
|
git clone https://github.com/ihatenodejs/pontus-mail.git
|
||||||
cd pontus-mail
|
cd pontus-mail
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Copy the example `docker-compose.yml`
|
2. Copy the example `docker-compose.yml`
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
mv docker-compose.yml.example docker-compose.yml
|
mv docker-compose.yml.example docker-compose.yml
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Copy the example `donations.json`
|
3. Copy the example `donations.json`
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
mv donations.json.example donations.json
|
mv donations.json.example donations.json
|
||||||
```
|
```
|
||||||
|
|
||||||
4. Copy the example `.env`
|
4. Copy the example `.env`
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
mv .env.example .env
|
mv .env.example .env
|
||||||
```
|
```
|
||||||
|
|
||||||
Make sure you edit this with your MySQL server information and other values.
|
Make sure you edit this with the desired internal port. We suggest keeping the internal port set to `3000`.
|
||||||
5. Install dependencies
|
5. Install dependencies
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
npm install
|
npm install
|
||||||
```
|
```
|
||||||
|
|
||||||
6. Start the server
|
6. Start the server
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
node app.js
|
node app.js
|
||||||
```
|
```
|
||||||
|
|
||||||
You will now have a fully functioning Node.js Express server, which will be running on port `3000`.
|
You will now have a fully functioning Node.js Express server, which will be running on port `3000`.
|
||||||
## With Docker
|
|
||||||
|
### Using Docker
|
||||||
|
|
||||||
You can also use Docker to self-host pontus-mail's frontend. Make sure you have docker-compose or docker-compose-plugin installed on your system.
|
You can also use Docker to self-host pontus-mail's frontend. Make sure you have docker-compose or docker-compose-plugin installed on your system.
|
||||||
|
|
||||||
1. Clone the repo
|
1. Clone the repo
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
git clone https://github.com/ihatenodejs/pontus-mail.git
|
git clone https://github.com/ihatenodejs/pontus-mail.git
|
||||||
cd pontus-mail
|
cd pontus-mail
|
||||||
```
|
```
|
||||||
|
|
||||||
2. Copy the example `docker-compose.yml`
|
2. Copy the example `docker-compose.yml`
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
mv docker-compose.yml.example docker-compose.yml
|
mv docker-compose.yml.example docker-compose.yml
|
||||||
```
|
```
|
||||||
|
|
||||||
3. Copy the example `.env`
|
3. Copy the example `.env`
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
mv .env.example .env
|
mv .env.example .env
|
||||||
```
|
```
|
||||||
|
|
||||||
Make sure you edit this file with values matching in `docker-compose.xml`, and other desired values like admin username/password.
|
This configuration's defaults have been set to be compatible with Docker. Please do not change this file unless you know what you're doing!
|
||||||
4. Copy the example `donations.json`
|
4. Copy the example `donations.json`
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
mv donations.json.example donations.json
|
mv donations.json.example donations.json
|
||||||
```
|
```
|
||||||
|
|
||||||
5. Start and build Docker containers
|
5. Start and build Docker containers
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
docker compose up -d --build
|
docker compose up -d --build
|
||||||
```
|
```
|
||||||
|
|
||||||
You will now have a fully functioning Node.js Express server, which will be running on the port specified in `docker-compose.yml`, and internally on port `3000`.
|
You will now have a fully functioning Node.js Express server, which will be running on the port specified in `docker-compose.yml`, and internally on port `3000`.
|
||||||
|
|
||||||
# To-Do
|
## To-Do
|
||||||
|
|
||||||
- [ ] Port to NextJS?
|
- [ ] Port to NextJS?
|
||||||
- [ ] Hovering effects for buttons
|
- [ ] Hovering effects for buttons
|
||||||
|
- [ ] Reintegrate backend logic for counters on home page
|
||||||
- [ ] Statistics animation
|
- [ ] Statistics animation
|
||||||
|
|
||||||
|
57
app.js
57
app.js
@ -6,6 +6,21 @@ const axios = require('axios');
|
|||||||
const NodeCache = require('node-cache');
|
const NodeCache = require('node-cache');
|
||||||
const cache = new NodeCache({ stdTTL: 1800 });
|
const cache = new NodeCache({ stdTTL: 1800 });
|
||||||
|
|
||||||
|
function checkSetup() {
|
||||||
|
if (!fs.existsSync(path.join(__dirname, '.env'))) {
|
||||||
|
console.error("Couldn't find .env file, please create one using the provided .env.example file.");
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
const reqVar = ['INTERNAL_PORT'];
|
||||||
|
const missingVar = reqVar.filter(envVar => !process.env[envVar]);
|
||||||
|
|
||||||
|
if (missingVar.length > 0) {
|
||||||
|
console.error(`Oops, you're missing these required variables in your .env file: ${missingVar.join(', ')}`);
|
||||||
|
process.exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
require('dotenv').config();
|
require('dotenv').config();
|
||||||
const app = express();
|
const app = express();
|
||||||
|
|
||||||
@ -15,45 +30,8 @@ app.set('views', path.join(__dirname, 'src'));
|
|||||||
app.use(bodyParser.urlencoded({ extended: false }));
|
app.use(bodyParser.urlencoded({ extended: false }));
|
||||||
app.use(express.static(path.join(__dirname, 'public')));
|
app.use(express.static(path.join(__dirname, 'public')));
|
||||||
|
|
||||||
//async function fetchDomainData() {
|
// TODO: Reintegrate backend logic for counters on home page
|
||||||
// const cachedData = cache.get('domainData');
|
|
||||||
// if (cachedData) {
|
|
||||||
// return cachedData;
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// try {
|
|
||||||
// const response = await axios.get('https://user.p0ntus.com/api/v1/get/domain/all', {
|
|
||||||
// headers: {
|
|
||||||
// 'accept': 'application/json',
|
|
||||||
// 'X-API-Key': process.env.MC_API_KEY
|
|
||||||
// }
|
|
||||||
// });
|
|
||||||
// const domainData = response.data;
|
|
||||||
// cache.set('domainData', domainData);
|
|
||||||
// return domainData;
|
|
||||||
// } catch (error) {
|
|
||||||
// console.error('Error fetching domain data:', error);
|
|
||||||
// return [];
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
//function getDomains() {
|
|
||||||
// const domainsPath = path.join(__dirname, 'domains.txt');
|
|
||||||
// try {
|
|
||||||
// const domains = fs.readFileSync(domainsPath, 'utf-8').split('\n').filter(Boolean);
|
|
||||||
// return domains;
|
|
||||||
// } catch (error) {
|
|
||||||
// console.error('Error reading domains.txt:', error);
|
|
||||||
// return [];
|
|
||||||
// }
|
|
||||||
//}
|
|
||||||
|
|
||||||
app.get('/', async (req, res) => {
|
app.get('/', async (req, res) => {
|
||||||
//const domainData = await fetchDomainData();
|
|
||||||
//const domainCount = Array.isArray(domainData) ? domainData.length : 0;
|
|
||||||
//const accountCount = Array.isArray(domainData) ? domainData.reduce((acc, domain) => acc + domain.mboxes_in_domain, 0) : 0;
|
|
||||||
//const totalData = Array.isArray(domainData) ? domainData.reduce((acc, domain) => acc + parseInt(domain.bytes_total), 0) / (1024 * 1024) : 0;
|
|
||||||
|
|
||||||
res.render('index', { currentPage: 'home' });
|
res.render('index', { currentPage: 'home' });
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -122,7 +100,8 @@ app.get('/guides/vaultwarden/firefox', (req, res) => {
|
|||||||
res.render('guides/vaultwarden/firefox', { currentPage: 'guides' });
|
res.render('guides/vaultwarden/firefox', { currentPage: 'guides' });
|
||||||
});
|
});
|
||||||
|
|
||||||
// Start server on internal port defined in .env
|
// Verify .env and start server on internal port defined in .env
|
||||||
|
checkSetup();
|
||||||
app.listen(process.env.INTERNAL_PORT, () => {
|
app.listen(process.env.INTERNAL_PORT, () => {
|
||||||
console.log(`Server started on port ${process.env.INTERNAL_PORT}`);
|
console.log(`Server started on port ${process.env.INTERNAL_PORT}`);
|
||||||
});
|
});
|
@ -16,7 +16,7 @@
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<i class="il mt-5">Email</i>
|
<i class="il">Email</i>
|
||||||
<hr>
|
<hr>
|
||||||
<ul class="list-group text-start">
|
<ul class="list-group text-start">
|
||||||
<li class="list-group-item">
|
<li class="list-group-item">
|
||||||
@ -27,7 +27,7 @@
|
|||||||
</li>
|
</li>
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<i class="il mt-5">User Dashboard</i>
|
<i class="il">User Dashboard</i>
|
||||||
<hr>
|
<hr>
|
||||||
<ul class="list-group text-start">
|
<ul class="list-group text-start">
|
||||||
<li class="list-group-item">
|
<li class="list-group-item">
|
||||||
|
@ -17,6 +17,7 @@
|
|||||||
<a href="https://user.pontusmail.org/webmail/" class="btn bg-dark text-white mt-2"><i class="fa-solid fa-envelope ico-sm"></i> Webmail</a>
|
<a href="https://user.pontusmail.org/webmail/" class="btn bg-dark text-white mt-2"><i class="fa-solid fa-envelope ico-sm"></i> Webmail</a>
|
||||||
<a href="https://user.pontusmail.org" class="btn bg-dark text-white mt-2"><i class="fa-solid fa-user ico-sm"></i> Account</a>
|
<a href="https://user.pontusmail.org" class="btn bg-dark text-white mt-2"><i class="fa-solid fa-user ico-sm"></i> Account</a>
|
||||||
<a href="https://vaultwarden.p0ntus.com" class="btn bg-dark text-white mt-2"><i class="fa-solid fa-key ico-sm"></i> Vaultwarden</a>
|
<a href="https://vaultwarden.p0ntus.com" class="btn bg-dark text-white mt-2"><i class="fa-solid fa-key ico-sm"></i> Vaultwarden</a>
|
||||||
|
<a href="https://git.pontusmail.org" class="btn bg-dark text-white mt-2"><i class="fa-brands fa-git-alt ico-sm"></i> Git</a>
|
||||||
<a href="/guides" class="btn bg-dark text-white mt-2"><i class="fa-solid fa-book ico-sm"></i> Guides</a>
|
<a href="/guides" class="btn bg-dark text-white mt-2"><i class="fa-solid fa-book ico-sm"></i> Guides</a>
|
||||||
<a href="https://user.pontusmail.org/admin/client" class="btn bg-dark text-white mt-2"><i class="fa-solid fa-question ico-sm"></i> Client Setup</a>
|
<a href="https://user.pontusmail.org/admin/client" class="btn bg-dark text-white mt-2"><i class="fa-solid fa-question ico-sm"></i> Client Setup</a>
|
||||||
</div>
|
</div>
|
||||||
|
@ -6,23 +6,25 @@
|
|||||||
<p class="text-start"><b>Our system collects automatically:</b></p>
|
<p class="text-start"><b>Our system collects automatically:</b></p>
|
||||||
<ul class="list-group text-start">
|
<ul class="list-group text-start">
|
||||||
<li class="list-group-item">Log files which may include the currently logged-in IP address, user agent, or other identifying information. We clear this data as much as possible.</li>
|
<li class="list-group-item">Log files which may include the currently logged-in IP address, user agent, or other identifying information. We clear this data as much as possible.</li>
|
||||||
|
<li class="list-group-item">Linked external email addresses' folders, last check date, status, created date, users, and the ability to take actions (like you can on your dashboard).</li>
|
||||||
<li class="list-group-item">Storage and disk quota used by your account</li>
|
<li class="list-group-item">Storage and disk quota used by your account</li>
|
||||||
<li class="list-group-item">Account creation date (no time)</li>
|
<li class="list-group-item">Account creation date (no time)</li>
|
||||||
<li class="list-group-item">Linked external email addresses' folders, last check date, status, created date, users, and the ability to take actions (like you can on your dashboard).</li>
|
|
||||||
<li class="list-group-item">Automatic reply settings</li>
|
<li class="list-group-item">Automatic reply settings</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p class="text-start mt-3"><b>What I collect by choice:</b></p>
|
<p class="text-start mt-3"><b>What I collect by choice:</b></p>
|
||||||
<ul class="list-group text-start">
|
<ul class="list-group text-start">
|
||||||
<li class="list-group-item">I do not collect any extra information at the moment</li>
|
<li class="list-group-item">I do not collect any extra information at the moment</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p class="text-start mt-3"><b>What the admin has access to:</b></p>
|
<p class="text-start mt-3"><b>What admins have access to:</b></p>
|
||||||
<ul class="list-group text-start">
|
<ul class="list-group text-start">
|
||||||
<li class="list-group-item">Your email address</li>
|
<!-- This is classified as what front-end services are available to Mailu admins-->
|
||||||
<li class="list-group-item">Reset your password (your existing password is not visible)</li>
|
<li class="list-group-item">Reset your password (your existing password is not visible)</li>
|
||||||
|
<li class="list-group-item">Most automatically collected data (see above)</li>
|
||||||
|
<li class="list-group-item">Your registered email address</li>
|
||||||
|
<li class="list-group-item">Change your account quotas</li>
|
||||||
<li class="list-group-item">Delete your account</li>
|
<li class="list-group-item">Delete your account</li>
|
||||||
<li class="list-group-item">Change your quotas</li>
|
|
||||||
<li class="list-group-item">Decrypt emails stored on server</li>
|
|
||||||
</ul>
|
</ul>
|
||||||
|
<p class="text-start mt-3"><b>Please Note:</b> It may be possible for the server owner (or an administrator with shell access) to view your messages</p>
|
||||||
<i class="il mt-3">What I do with the data collected</i>
|
<i class="il mt-3">What I do with the data collected</i>
|
||||||
<hr>
|
<hr>
|
||||||
<p class="text-start">I don't store any of your data for monetary gain or marketing purposes. I have nothing to market to you.</p>
|
<p class="text-start">I don't store any of your data for monetary gain or marketing purposes. I have nothing to market to you.</p>
|
||||||
@ -31,9 +33,9 @@
|
|||||||
<p class="text-start">I will never share your data with third parties unless required by law.</p>
|
<p class="text-start">I will never share your data with third parties unless required by law.</p>
|
||||||
<i class="il mt-3">Security</i>
|
<i class="il mt-3">Security</i>
|
||||||
<hr>
|
<hr>
|
||||||
|
<p class="text-start">Provided all of our security is functioning, only the owners of this service (p0ntus and lucmsilva) and the hosting provider (Namecheap) has access to the data and server.</p>
|
||||||
<p class="text-start">I am committed to ensuring that your data is secure. However, I am no security professional.</p>
|
<p class="text-start">I am committed to ensuring that your data is secure. However, I am no security professional.</p>
|
||||||
<p class="text-start">p0ntus mail is powered by Mailcow, running in Docker. I check for updates several times a day.</p>
|
<p class="text-start">p0ntus mail is powered by Mailu, running in Docker. Updates are applied daily for security.</p>
|
||||||
<p class="text-start">A strong firewall is backing the server. The server is physically located in Michigan, USA.</p>
|
<p class="text-start">The server hosting all of LibreCloud and p0ntus mail is physically located in Atlanta, Georgia and rented from Namecheap Inc.</p>
|
||||||
<p class="text-start">Your emails are stored encrypted and compressed (using LZ4). I, as the server admin, have access to the decryption keys.</p>
|
|
||||||
</div>
|
</div>
|
||||||
<%- include('shards/footer') %>
|
<%- include('shards/footer') %>
|
@ -33,8 +33,8 @@
|
|||||||
<div class="col-md-6 mb-4">
|
<div class="col-md-6 mb-4">
|
||||||
<div class="card">
|
<div class="card">
|
||||||
<div class="card-body">
|
<div class="card-body">
|
||||||
<h5 class="card-title"><i class="fa-solid fa-server ico-sm"></i> Personally Managed</h5>
|
<h5 class="card-title"><i class="fa-solid fa-server ico-sm"></i> Additional Services</h5>
|
||||||
<p class="card-text">p0ntus mail is personally managed and monitored for maximum uptime.</p>
|
<p class="card-text">p0ntus mail offers an ever-changing selection of additional services such as Git, available for free.</p>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
@ -46,16 +46,18 @@
|
|||||||
<li class="list-group-item">4000 MB storage (may vary)</li>
|
<li class="list-group-item">4000 MB storage (may vary)</li>
|
||||||
<li class="list-group-item">Roundcube Webmail</li>
|
<li class="list-group-item">Roundcube Webmail</li>
|
||||||
<li class="list-group-item">Contacts List</li>
|
<li class="list-group-item">Contacts List</li>
|
||||||
<li class="list-group-item">IMAP/SMTP access</li>
|
<li class="list-group-item">IMAP/SMTP access (TLS)</li>
|
||||||
<li class="list-group-item">Spam protection</li>
|
<li class="list-group-item">Spam protection</li>
|
||||||
<li class="list-group-item">5 outgoing messages per hour</li>
|
<li class="list-group-item">Fair-use outgoing message policy</li>
|
||||||
<li class="list-group-item">Vaultwarden password manager</li>
|
<li class="list-group-item"><a href="https://vaultwarden.p0ntus.com/">Password manager</a> (Vaultwarden)</li>
|
||||||
|
<li class="list-group-item"><a href="https://git.pontusmail.org/">Unlimited Git access</a> (Gitea)</li>
|
||||||
</ul>
|
</ul>
|
||||||
<p class="text-start mt-3">You may request for additional storage, or increased account limits by contacting <a href="mailto:admin@p0ntus.com">admin<i class="fa-solid fa-at p"></i>p0ntus.com</a>. We operate under a "fair use" policy.</p>
|
<p class="text-start mt-3">You may request for additional storage, or increased account limits by contacting <a href="mailto:admin@p0ntus.com">admin<i class="fa-solid fa-at p"></i>p0ntus.com</a>. We operate under a "fair use" policy.</p>
|
||||||
<p class="text-start mt-3">You may also be limited in storage depending on your use. There is a 100% chance you will get 4000 MB if you would like to actually use the email service. Some people will not use their accounts and hold up disk quotas.</p>
|
<p class="text-start mt-3">You may also be limited in storage depending on your use. There is a 100% chance you will get 4000 MB if you would like to actually use the email service. Some people will not use their accounts and hold up disk quotas.</p>
|
||||||
|
<p class="text-start mt-3">All aforementioned services are self-hosted on <b>our servers</b>. All data is under control by me and the hosting provider (Namecheap).</p>
|
||||||
<i class="il mt-3">Vaultwarden</i>
|
<i class="il mt-3">Vaultwarden</i>
|
||||||
<hr>
|
<hr>
|
||||||
<p class="text-start">Vaultwarden is a password manager that is included with your services. You can access it by visiting <a href="https://vaultwarden.p0ntus.com">vaultwarden.p0ntus.com</a> and creating a account.</p>
|
<p class="text-start">Vaultwarden is a password manager that is included with your services. You can access it by visiting <a href="https://vaultwarden.p0ntus.com">vaultwarden.p0ntus.com</a> and creating a account.</p>
|
||||||
<p class="text-start">You do not need a p0ntus mail account to create a Vaultwarden account.</p>
|
<p class="text-start">You will need a p0ntus mail account to create a Vaultwarden account.</p>
|
||||||
</div>
|
</div>
|
||||||
<%- include('shards/footer') %>
|
<%- include('shards/footer') %>
|
Reference in New Issue
Block a user