112 lines
3.2 KiB
Markdown
112 lines
3.2 KiB
Markdown
# arcline-portal
|
||
|
||
Customer dashboard for arclineit.com. Provides SSL expiry monitoring and a support ticket system — without requiring customers to SSH into anything.
|
||
|
||
Sits alongside WHMCS for billing; handles everything WHMCS doesn't.
|
||
|
||
## Stack
|
||
|
||
- Go backend, vanilla HTML/CSS/JS (Arcline design system)
|
||
- SQLite (single file, no server required)
|
||
- Session-based auth (bcrypt + secure cookies)
|
||
- Ships as a single binary with embedded static assets and templates
|
||
|
||
## Modules
|
||
|
||
### SSL Expiry Dashboard
|
||
Customers add domains; the system checks cert expiry daily via TLS dial and displays status color-coded: green > 30d, amber 14–30d, red < 14d.
|
||
|
||
### Support Tickets
|
||
Customer opens a ticket; Blake gets an email. Replies go back into the thread from the portal UI. No third-party helpdesk.
|
||
|
||
## Deployment
|
||
|
||
### Prerequisites
|
||
|
||
- Linux server (amd64 or arm64)
|
||
- nginx
|
||
- An `arcline` system user
|
||
|
||
### Build
|
||
|
||
```sh
|
||
# Local binary
|
||
make build
|
||
|
||
# Cross-compile for Linux
|
||
make linux-amd64
|
||
make linux-arm64
|
||
```
|
||
|
||
### Install
|
||
|
||
```sh
|
||
# Create directories and user
|
||
sudo useradd -r -s /sbin/nologin -d /opt/arcline-portal arcline
|
||
sudo mkdir -p /opt/arcline-portal
|
||
sudo chown arcline:arcline /opt/arcline-portal
|
||
|
||
# Copy binary
|
||
sudo cp arcline-portal-linux-amd64 /opt/arcline-portal/arcline-portal
|
||
sudo chmod +x /opt/arcline-portal/arcline-portal
|
||
|
||
# Copy and populate env file
|
||
sudo cp .env.example /opt/arcline-portal/.env
|
||
sudo chown arcline:arcline /opt/arcline-portal/.env
|
||
sudo chmod 600 /opt/arcline-portal/.env
|
||
# Edit /opt/arcline-portal/.env and fill in real values
|
||
```
|
||
|
||
### systemd
|
||
|
||
```sh
|
||
sudo cp deploy/arcline-portal.service /etc/systemd/system/
|
||
sudo systemctl daemon-reload
|
||
sudo systemctl enable --now arcline-portal
|
||
sudo systemctl status arcline-portal
|
||
```
|
||
|
||
### nginx
|
||
|
||
```sh
|
||
sudo cp deploy/nginx-portal.conf /etc/nginx/sites-available/arcline-portal
|
||
sudo ln -s /etc/nginx/sites-available/arcline-portal /etc/nginx/sites-enabled/
|
||
sudo nginx -t && sudo systemctl reload nginx
|
||
```
|
||
|
||
Expects TLS certificates at:
|
||
- `/etc/ssl/arclineit.com/fullchain.pem`
|
||
- `/etc/ssl/arclineit.com/privkey.pem`
|
||
|
||
### Seed first admin account
|
||
|
||
```sh
|
||
sudo -u arcline /opt/arcline-portal/arcline-portal \
|
||
-seed \
|
||
-username blake \
|
||
-name "Blake" \
|
||
-password "changeme"
|
||
```
|
||
|
||
## Environment variables
|
||
|
||
Copy `.env.example` to `.env` and set the following:
|
||
|
||
| Variable | Default | Description |
|
||
|---|---|---|
|
||
| `PORT` | `8082` | HTTP listen port (nginx proxies to this) |
|
||
| `DB_PATH` | `./portal.db` | Path to the portal SQLite database |
|
||
| `UPTIME_DB_PATH` | `../arcline-uptime/uptime.db` | Path to arcline-uptime's database (read-only); omit if not using uptime integration |
|
||
| `SESSION_SECRET` | — | 32-byte hex secret for session tokens. Generate with: `openssl rand -hex 32` |
|
||
| `SMTP_HOST` | `mail.arclineit.com` | SMTP server hostname |
|
||
| `SMTP_PORT` | `587` | SMTP port (STARTTLS) |
|
||
| `SMTP_USER` | — | SMTP username |
|
||
| `SMTP_PASS` | — | SMTP password |
|
||
| `SMTP_FROM` | `portal@arclineit.com` | From address for outbound email |
|
||
| `ADMIN_EMAIL` | `blake@arclineit.com` | Receives new ticket notifications |
|
||
| `BASE_URL` | `https://portal.arclineit.com` | Base URL used in email links (no trailing slash) |
|
||
|
||
## License
|
||
|
||
MIT — see [LICENSE](LICENSE).
|