Self-hosted hosting finance dashboard for Pterodactyl + Paymenter
Crescent is an open-source dashboard for managing and visualizing your hosting income, costs, and server usage built to work seamlessly with Pterodactyl and Paymenter.
πΈ Track node-linked income π» Monitor usage like Grafana π§Ύ Add and sort custom expenses
- π Dashboard: Overall income and key metrics at a glance.
- π° Incomings: Detailed income data fetched from Paymenter, organized by node.
- πΈ Outgoings: Easily add and manage expenses, categorized by node or as miscellaneous costs.
- π Machine Usage: Grafana-style graphs providing insights into RAM and storage utilization.
- βοΈ Settings: Personalize your account options and configure 2-Factor Authentication for enhanced security.
- π Admin: Powerful user management interface with role-based access control.
- π Demo: crescent.exphost.net
- π Docs: docs.exphost.net/
- π§° Install Scripts: billing.exphost.net
This guide will walk you through the manual installation of Crescent on a Linux system.
sudo apt update
sudo apt install python3 python3-pip nginxmkdir /var/www/crescent
cd /var/www/crescentcurl -Lo crescent.tar.gz https://github.com/exphost-net/Crescent/releases/latest/download/crescent.tar.gztar -xzvf crescent.tar.gzpip install -r requirements.txtFirst, access the MySQL command line interface on the machine hosting your Pterodactyl panel:
sudo mysql -u root -pThen, create a dedicated user for Crescent with the necessary permissions. Replace your_crescent_host_ip with the IP address of the machine where Crescent is being installed. If Crescent is on the same machine as Pterodactyl, you can use localhost or 127.0.0.1. Remember to choose a strong password instead of secure-password.
CREATE USER 'crescent'@'your_crescent_host_ip' IDENTIFIED BY 'secure-password';
GRANT SELECT ON panel.* TO 'crescent'@'your_crescent_host_ip';
FLUSH PRIVILEGES;
QUIT;Similarly, access the MySQL command line interface on the machine hosting your Paymenter installation:
sudo mysql -u root -pCreate a dedicated user for Crescent. Again, replace your_crescent_host_ip with the IP address of the Crescent server (use localhost or 127.0.0.1 if it's the same as Paymenter) and choose a secure password.
CREATE USER 'crescent'@'your_crescent_host_ip' IDENTIFIED BY 'secure-password';
GRANT SELECT ON paymenter.* TO 'crescent'@'your_crescent_host_ip';
FLUSH PRIVILEGES;
QUIT;Copy the example environment file:
cp .env.example .envNow, edit the .env file to include your database credentials, Pterodactyl API details, and the default admin user information:
PAYMENTER_DB_USER=crescent
PAYMENTER_DB_PASSWORD=secure-password
PAYMENTER_DB_HOST=your_paymenter_host_ip
PAYMENTER_DB_NAME=paymenter
PTERODACTYL_DB_USER=crescent
PTERODACTYL_DB_PASSWORD=secure-password
PTERODACTYL_DB_HOST=your_pterodactyl_host_ip
PTERODACTYL_DB_NAME=panel
PTERODACTYL_API_URL=https://panel.example.com/
PTERODACTYL_API_KEY=ptero-api
DEFAULT_ADMIN_EMAIL=admin@example.com
DEFAULT_ADMIN_PASSWORD=ChangeMe123
Important: Replace the placeholder values with your actual configuration, and make sure to change the admin password.
sudo chown -R www-data:www-data /var/www/crescentCreate a service definition for Crescent:
sudo nano /etc/systemd/system/crescent.servicePaste the following content into the file:
[Unit]
Description=Crescent Backend
After=network.target
[Service]
Type=simple
User=www-data
Group=www-data
WorkingDirectory=/var/www/crescent
ExecStart=/usr/bin/python3 /var/www/crescent/app.py
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.targetSave and close the file (CTRL+X, then y, then Enter).
sudo systemctl daemon-reload
sudo systemctl enable crescent.service
sudo systemctl start crescent.serviceThis section guides you through configuring Nginx to serve the Crescent application.
-
DNS Configuration: Create an A record for your desired subdomain (e.g.,
crescent.example.com) pointing to the IP address of your server. If using Cloudflare, ensure the proxy (orange cloud) is disabled. -
Create the Nginx configuration file:
sudo nano /etc/nginx/sites-available/crescent.conf
-
Paste the following configuration, replacing
crescent.example.comwith your actual domain or subdomain:server { listen 80 default_server; listen [::]:80 default_server; server_name crescent.example.com; location / { proxy_pass http://127.0.0.1:5000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
Save the file (
CTRL+X, theny, thenEnter). -
Enable the configuration:
sudo ln -s /etc/nginx/sites-available/crescent.conf /etc/nginx/sites-enabled/crescent.conf
-
Restart Nginx:
sudo systemctl restart nginx
You can now access Crescent at
http://crescent.example.com:80or simplyhttp://crescent.example.comif port 80 is the default.
-
DNS Configuration: Create an A record for your desired subdomain (e.g.,
crescent.example.com) pointing to the IP address of your server. If using Cloudflare, ensure the proxy (orange cloud) is disabled. -
Install Certbot: Install Certbot and the Nginx plugin for automatic SSL certificate management:
sudo apt install certbot python3-certbot-nginx
-
(Optional) Auto-Renewal: To set up automatic renewal of your SSL certificates, edit the crontab:
sudo crontab -e
Add the following line (if it's not already present):
0 23 * * * certbot renew --quiet --deploy-hook "systemctl restart nginx"
Save and close the crontab.
-
Obtain SSL Certificates: Request SSL certificates for your domain using Certbot. Replace
crescent.example.comwith your actual domain:sudo certbot --nginx -d crescent.example.com
Follow the prompts to complete the certificate issuance process.
-
Create or edit the Nginx configuration file:
sudo nano /etc/nginx/sites-available/crescent.conf
-
Paste the following configuration, ensuring you replace
crescent.example.comwith your actual domain:server { listen 80 default_server; listen [::]:80 default_server; server_name crescent.example.com; return 301 https://$host$request_uri; } server { listen 443 ssl default_server; listen [::]:443 ssl default_server; server_name crescent.example.com; ssl_certificate /etc/letsencrypt/live/crescent.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/crescent.example.com/privkey.pem; ssl_protocols TLSv1.2 TLSv1.3; ssl_prefer_server_ciphers on; ssl_ciphers 'ECDHE+AESGCM:CHACHA20'; ssl_ecdh_curve secp384r1; location / { proxy_pass http://127.0.0.1:5000; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; } }
Save the file (
CTRL+X, theny, thenEnter). -
Enable the configuration:
sudo ln -s /etc/nginx/sites-available/crescent.conf /etc/nginx/sites-enabled/crescent.conf
-
Restart Nginx:
sudo systemctl restart nginx
You can now access Crescent securely at
https://crescent.example.com.
To update Crescent to the latest version, follow these steps:
-
Download the latest release:
curl -Lo crescent.tar.gz https://github.com/exphost-net/Crescent/releases/latest/download/crescent.tar.gz
-
Extract the downloaded archive:
tar -xzvf crescent.tar.gz
-
Install updated Python dependencies:
pip install -r requirements.txt
-
Restart the Crescent service:
sudo systemctl restart crescent.service
That's it! Crescent should now be updated to the latest version.
- Python / Flask (backend)
- HTML/CSS/JS (frontend)
- API integrations (Pterodactyl, Paymenter)
This project is licensed under the GPL-3.0 License.
Created by ExpHost Maintained by the ExpHost Team - crescent.exphost.net