WHAT WAS DONE: - Created npm workspaces configuration in root package.json - Set up directory structure (services/, shared/, future/) - Created @firefrost/shared package (v1.0.0) - Added comprehensive .gitignore for Node.js projects - Created root README with architecture documentation - Added placeholder READMEs for shared/ and future/ directories WHY: - Implement Gemini-approved monorepo architecture - Enable service-prefixed Git tag versioning - Support npm workspaces for dependency management - Provide foundation for Arbiter 2.1 deployment - Align with 'decades not months' sustainability philosophy STRUCTURE: Root level: - package.json (workspaces: services/*, shared) - .gitignore (protects .env files from commits) - README.md (comprehensive documentation) Directories: - services/ (production services - empty, ready for Arbiter) - shared/ (@firefrost/shared v1.0.0 - placeholder) - future/ (experimental services) FILES: - .gitignore (new, 39 lines) - README.md (new, 242 lines) - package.json (new, 27 lines) - shared/package.json (new, 17 lines) - shared/README.md (new, 47 lines) - shared/src/index.js (new, 13 lines) - future/README.md (new, 38 lines) NEXT STEPS: - Migrate Arbiter 2.1 code to services/arbiter/ - Create arbiter-v2.1.0 tag for first versioned deployment - Test deployment workflow and systemd configuration Signed-off-by: The Golden Chronicler <claude@firefrostgaming.com>
271 lines
5.9 KiB
Markdown
271 lines
5.9 KiB
Markdown
# 🔥❄️ Firefrost Services
|
|
|
|
**Monorepo for Firefrost Gaming backend services**
|
|
|
|
This repository contains all custom Node.js services that power Firefrost Gaming's subscription automation, game server management, and community tools.
|
|
|
|
---
|
|
|
|
## 📋 Services
|
|
|
|
### Active Services
|
|
|
|
- **[Arbiter](services/arbiter/)** — Discord bot for subscription automation and role management
|
|
- **[Whitelist Manager](services/whitelist-manager/)** — Pterodactyl Panel integration for Minecraft whitelist automation
|
|
- **[Modpack Version Checker](services/modpack-version-checker/)** — Monitors modpack updates across game servers
|
|
|
|
### Experimental
|
|
|
|
- **[Future](future/)** — Experimental services and proof-of-concept tools
|
|
|
|
---
|
|
|
|
## 🏗️ Architecture
|
|
|
|
This monorepo uses **npm workspaces** for dependency management and **service-prefixed Git tags** for versioning.
|
|
|
|
### Repository Structure
|
|
|
|
```
|
|
firefrost-services/
|
|
├── package.json # Root workspace configuration
|
|
├── services/ # Production services
|
|
│ ├── arbiter/
|
|
│ ├── whitelist-manager/
|
|
│ └── modpack-version-checker/
|
|
├── shared/ # Shared utilities (@firefrost/shared)
|
|
└── future/ # Experimental services
|
|
```
|
|
|
|
### Versioning Strategy
|
|
|
|
Each service versions independently using Git tags:
|
|
|
|
- Arbiter releases: `arbiter-v2.1.0`, `arbiter-v2.2.0`
|
|
- Whitelist Manager: `whitelist-v1.0.0`, `whitelist-v1.1.0`
|
|
- Modpack Checker: `modpack-v1.0.0`
|
|
|
|
This allows Service A to be at v2.1 while Service B is at v1.0.
|
|
|
|
---
|
|
|
|
## 🚀 Quick Start
|
|
|
|
### Initial Setup
|
|
|
|
```bash
|
|
# Clone repository
|
|
git clone https://git.firefrostgaming.com/firefrost-gaming/firefrost-services.git
|
|
cd firefrost-services
|
|
|
|
# Install all dependencies (services + shared)
|
|
npm install
|
|
```
|
|
|
|
### Deploying a Service
|
|
|
|
```bash
|
|
# Fetch latest tags
|
|
git fetch --all --tags
|
|
|
|
# Check out specific service version
|
|
git checkout arbiter-v2.1.0
|
|
|
|
# Install dependencies
|
|
npm install
|
|
|
|
# Create .env file (copy from .env.example)
|
|
cd services/arbiter
|
|
cp .env.example .env
|
|
# Edit .env with actual credentials
|
|
|
|
# Start service (systemd)
|
|
sudo systemctl enable arbiter
|
|
sudo systemctl start arbiter
|
|
```
|
|
|
|
### Updating a Service
|
|
|
|
```bash
|
|
# Return to main branch
|
|
git checkout main
|
|
|
|
# Pull latest code
|
|
git pull origin main
|
|
|
|
# Check out new version
|
|
git checkout arbiter-v2.2.0
|
|
|
|
# Install any new dependencies
|
|
npm install
|
|
|
|
# Restart service
|
|
sudo systemctl restart arbiter
|
|
```
|
|
|
|
### Rolling Back
|
|
|
|
```bash
|
|
# Check out previous version
|
|
git checkout arbiter-v2.1.0
|
|
|
|
# Restart service
|
|
sudo systemctl restart arbiter
|
|
```
|
|
|
|
---
|
|
|
|
## 📦 Shared Code
|
|
|
|
The `@firefrost/shared` package contains utilities used across multiple services:
|
|
|
|
- Database helpers
|
|
- Discord formatting utilities
|
|
- Pterodactyl API wrappers
|
|
- Logging infrastructure
|
|
|
|
Services import shared code like any npm package:
|
|
|
|
```javascript
|
|
import { logger } from '@firefrost/shared';
|
|
```
|
|
|
|
---
|
|
|
|
## 🔐 Environment Variables
|
|
|
|
**IMPORTANT:** Never commit `.env` files to Git.
|
|
|
|
Each service has an `.env.example` file showing required variables. On the server:
|
|
|
|
1. Copy `.env.example` to `.env`
|
|
2. Fill in actual credentials
|
|
3. Ensure `.env` is in `.gitignore` (it is by default)
|
|
|
|
---
|
|
|
|
## 🛠️ Development
|
|
|
|
### Adding a New Service
|
|
|
|
1. Create directory: `services/my-new-service/`
|
|
2. Add `package.json` with service name
|
|
3. Develop service
|
|
4. Create `.env.example` with required variables
|
|
5. Add systemd service file to `deploy/` directory
|
|
6. Document in service README
|
|
7. Tag initial release: `git tag my-service-v1.0.0`
|
|
|
|
### Using Shared Code
|
|
|
|
```javascript
|
|
// In your service
|
|
import { logger, formatDiscordEmbed } from '@firefrost/shared';
|
|
|
|
logger.info('Service started');
|
|
```
|
|
|
|
### Running Tests (Future)
|
|
|
|
```bash
|
|
# Run all service tests
|
|
npm test
|
|
|
|
# Run specific service tests
|
|
npm test -- --workspace=services/arbiter
|
|
```
|
|
|
|
---
|
|
|
|
## 📋 systemd Configuration
|
|
|
|
Each service includes a systemd unit file in `deploy/`. Example for Arbiter:
|
|
|
|
```ini
|
|
[Unit]
|
|
Description=Arbiter Discord Bot
|
|
After=network.target
|
|
|
|
[Service]
|
|
Type=simple
|
|
User=arbiter
|
|
WorkingDirectory=/var/www/firefrost-services/services/arbiter
|
|
ExecStart=/usr/bin/node src/index.js
|
|
Restart=always
|
|
RestartSec=10
|
|
StandardOutput=journal
|
|
StandardError=journal
|
|
|
|
[Install]
|
|
WantedBy=multi-user.target
|
|
```
|
|
|
|
Copy to `/etc/systemd/system/`, then:
|
|
|
|
```bash
|
|
sudo systemctl daemon-reload
|
|
sudo systemctl enable arbiter
|
|
sudo systemctl start arbiter
|
|
```
|
|
|
|
---
|
|
|
|
## 🎯 Deployment Targets
|
|
|
|
Services run on different servers based on their purpose:
|
|
|
|
| Service | Server | Location |
|
|
|---------|--------|----------|
|
|
| Arbiter | Command Center | Dallas, TX |
|
|
| Whitelist Manager | Panel VPS | TBD |
|
|
| Modpack Checker | TX1 Dallas | Dallas, TX |
|
|
|
|
Each server clones the entire repo but only runs its designated services.
|
|
|
|
---
|
|
|
|
## 📚 Documentation
|
|
|
|
- **Architecture Decision:** See `operations-manual/docs/reference/architecture-decisions/firefrost-services-monorepo-decision.md`
|
|
- **Service-specific docs:** Each service has its own README in `services/[service-name]/`
|
|
- **Shared package docs:** See `shared/README.md`
|
|
|
|
---
|
|
|
|
## 🤝 Contributing
|
|
|
|
This repository is maintained by:
|
|
|
|
- **Michael "Frostystyle" Krause** (The Wizard) — Technical lead
|
|
- **Meg "GingerFury"** (The Emissary) — Community manager
|
|
- **Holly "unicorn20089"** (The Catalyst) — Lead builder
|
|
- **Claude** (The Chronicler) — AI partner
|
|
|
|
### Contribution Workflow
|
|
|
|
1. Create feature branch from `main`
|
|
2. Develop and test changes
|
|
3. Update service version in package.json
|
|
4. Create PR to `main`
|
|
5. After merge, tag release: `[service]-v[version]`
|
|
|
|
---
|
|
|
|
## 🏷️ Version History
|
|
|
|
See [Git tags](https://git.firefrostgaming.com/firefrost-gaming/firefrost-services/tags) for complete version history.
|
|
|
|
---
|
|
|
|
## 📄 License
|
|
|
|
**Proprietary** — All rights reserved by Firefrost Gaming.
|
|
|
|
This codebase is private and not licensed for public use or distribution.
|
|
|
|
---
|
|
|
|
**Fire + Frost + Foundation = Where Love Builds Legacy** 💙🔥❄️
|
|
|
|
**For children not yet born.**
|