Accounts Officer is a Node.js bot that queries platform APIs for account data and resources and pushes it into a Airtable base. It's a Cloud Native CLI container designed to be deployed as a Kubernetes CronJob. There are commands to run everything, each services or to show individual bits of data.
Accounts Officer currently supports pulling data from:
- DigitalOcean → Droplets, Volumes, Clusters, Volumes, Snapshots & Load Balancers
- AWS → Buckets & Domains and single-region RDS & Lightsails
- GoDaddy → domains
- SendGrid → API keys
Accounts Officer pulls in data from those services and merges records
with those already in Airtable.
It will try to update existing records or create new ones
and if a record no longer exists it marks it as unlinked
.
environment variables
see .env.example
config.json
Mount into the container at /app/config.json
,
see config.example.json
command
set your containers arguments to be the command you want it run,
it's set to all
by default
You need to have an Airtable base setup with the correct structure. The bot will only touch known fields so you can have extra custom columns if you like. But it will fail if the structure doesn't match what it is expecting.
Setup config.json
to map your Airtable base for the bot.
Set the base
value to link to a specific base
and use tables
to map each service to your table name.
Heres what each table should look like:
You can add whatever other custom fields you like!
DigitalOcean
Field | Type |
---|---|
Name | Single line text |
Type | Single Select - droplet, cluster, database, volume, snapshot, loadbalancer |
Status | Single Select - active, unlinked, new |
Cost | Currency |
AWS
Field | Type |
---|---|
Name | Single line text |
Type | Single Select - bucket, lightsail, domain, database |
Status | Single Select - active, unlinked, new |
Cost | Currency |
GoDaddy
Field | Type |
---|---|
Name | Single line text |
Type | Single Select - domain |
Status | Single Select - active, unlinked, new |
Expires | Date |
HttpResponse | Single line text |
SendGrid
Field | Type |
---|---|
Name | Single line text |
Type | Single Select - apikey |
Status | Single Select - active, unlinked, new |
To develop on this repo you will need to have Docker and Node.js installed on your dev machine and have an understanding of them. This guide assumes you have the repo checked out and are on macOS, but equivalent commands are available.
- yargs for CLI parsing and commands syntax
- got for http requests
- superstruct for validating javascript objects and structures
- puggle was used to bootstrap this project
You'll only need to follow this setup once for your dev machine.
# Setup your dev environment
# -> Fill in the values in your favourite text editor
cp .env.example .env
# Setup your app config
# -> Fill in the values in your favourite text editor
cp config.example.json config.json
# Install node.js dependencies
npm install
These are the commands you'll regularly run to develop the API, in no particular order.
# Get CLI usage and help
npm run start -- --help
# Run the CLI directly with a command
# -> Loads in the .env
# -> Runs TypeScript directly through ts-node
# -> -- seperator is needed for options
npm run start aws
# Start a node.js debugger running the CLI
# -> It will break on the first line of code to allow a debugger to be attached (--inspect-brk)
npm run debug godaddy
These are commands you might need to run but probably won't, also in no particular order.
# Manually run the TypeScript build
npm run build
# Run TypeScript as a linter
npm run lint
# Manually format all code using Prettier
npm run prettier
# Generate the table-of-contents in this readme
npm run readme-toc
The code in this repo is automatically formatted using [Prettier]. This may run in your IDE automatically on-save already. It is also setup to run the formatter on all git-staged code. This uses the yorkie and lint-staged packages which are configured in the package.json.
You can manually run the formatter with npm run format
if you want.
Releases are automated using git tags,
which should be generated using the npm version
command.
This generates a vX.Y.Z
git tag which, when pushed, runs a GitHub workflow
to build a container that is pushed to
GitHub Container Registry
- Add tests to ensure stability
- Refactor fixed logic into a functional data-based runner, see services/airtable.ts#fetchAndMerge
- Add more services/resources
- Pull in people too
- Allow aws regions to be customised
- Explore a "billing" sheet which pulls the monthly bill from each service
- Opt-in to services rather than requiring all
This project was set up by puggle