diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..7c1fbee --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,26 @@ +name: CI + +on: + pull_request: + types: [opened, synchronize, reopened] + +env: + CI: true + +jobs: + lint: + uses: NicTool/.github/.github/workflows/lint.yml@main + permissions: + contents: read + + coverage: + uses: NicTool/.github/.github/workflows/coverage.yml@main + secrets: inherit + permissions: + contents: read + + test: + uses: NicTool/.github/.github/workflows/test.yml@main + secrets: inherit + permissions: + contents: read diff --git a/.github/workflows/publish.yml b/.github/workflows/publish.yml new file mode 100644 index 0000000..13c2b0c --- /dev/null +++ b/.github/workflows/publish.yml @@ -0,0 +1,17 @@ +name: publish + +on: + release: + types: [published] + +env: + CI: true + +jobs: + publish: + uses: NicTool/.github/.github/workflows/publish.yml@main + secrets: inherit + permissions: + contents: read + packages: write + id-token: write \ No newline at end of file diff --git a/.gitignore b/.gitignore index 7b4837b..a359853 100644 --- a/.gitignore +++ b/.gitignore @@ -109,6 +109,5 @@ out config.yml CLAUDE.md GEMINI.md -.release/ data/ conf.d diff --git a/.release b/.release new file mode 160000 index 0000000..a6911a9 --- /dev/null +++ b/.release @@ -0,0 +1 @@ +Subproject commit a6911a90f1b15486fb319d844341421c78035b2a diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..bc40e93 --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,4 @@ + + + +[0.0.2]: https://github.com/NicTool/server/releases/tag/v0.0.2 diff --git a/CONTRIBUTORS.md b/CONTRIBUTORS.md new file mode 100644 index 0000000..1b33364 --- /dev/null +++ b/CONTRIBUTORS.md @@ -0,0 +1,9 @@ +# Contributors + +This handcrafted artisanal software is brought to you by: + +|
msimerson (6)| +| :---: | + +this file is generated by [.release](https://github.com/msimerson/.release). +Contribute to this project to get your GitHub profile included here. diff --git a/README.md b/README.md index e69de29..8acf7a4 100644 --- a/README.md +++ b/README.md @@ -0,0 +1,146 @@ +# NicTool Server + +NicTool is an open-source DNS management system. This package provides the **server** — a Node.js process that serves the web-based configurator UI, hosts the REST API (in-process or as a proxy), and manages TLS automatically. + +## Prerequisites + +- [Node.js](https://nodejs.org/) 18 or later +- `openssl` in `$PATH` (used to auto-generate self-signed TLS certs on first run) +- MySQL 8+ **or** a writable directory (for the TOML-based file store) + +## Quickstart + +### 1. Install + +```sh +npm install -g nictool +``` + +Or run without installing: + +```sh +npx nictool-server -c /var/lib/nictool +``` + +### 2. Create a data directory + +```sh +mkdir -p /var/lib/nictool +``` + +### 3. Start the server + +```sh +nictool-server -c /var/lib/nictool +``` + +On first run the server will: + +1. Generate a self-signed TLS certificate for your hostname and save it to `/var/lib/nictool/etc/tls/`. +2. Open the **web configurator** at `https://` (falls back to port `8443` if 443 is unavailable). + +### 4. Complete setup in the browser + +Open the URL printed to the console, fill in the configuration form, and click **Save**. The configurator writes `/var/lib/nictool/etc/nictool.toml` and starts the API automatically. + +> **TLS warning** – The auto-generated certificate is self-signed. Accept the browser security warning for the initial setup, then replace it with a trusted certificate (see [TLS](#tls) below). + +--- + +## Configuration + +All settings live in `/etc/nictool.toml`. The file is created by the web configurator but can also be edited by hand. The server reads it on every start. + +### Data store options + +| `store.type` | Description | +|---|---| +| `mysql` | Production-ready; requires MySQL 8+ | +| `directory` | File-based TOML store; good for development | + +#### MySQL example + +```toml +[store] +type = "mysql" +host = "127.0.0.1" +port = 3306 +user = "nictool" +password = "secret" +database = "nictool" +``` + +#### Directory (file) example + +```toml +[store] +type = "directory" +path = "/var/lib/nictool/zones" +``` + +### API mode + +The API can run **in-process** (default) or as a **remote** service: + +```toml +[api] +mode = "local" # "local" | "remote" +port = 3000 # only used for remote mode +host = "" # only used for remote mode +``` + +--- + +## TLS + +On startup the server looks for certificates in `/etc/tls/` in this order: + +1. `.pem` — combined PEM (private key + certificate chain) +2. `localhost.pem` — combined PEM, bound as `localhost` +3. `cert.pem` + `key.pem` — legacy split files + +If none are found, a self-signed certificate is generated via `openssl` and saved as `.pem`. + +To use your own certificate, place a combined PEM file at: + +``` +/etc/tls/.pem +``` + +--- + +## CLI reference + +``` +nictool-server -c + +Options: + -c, --config Path to the NicTool data root (required). +``` + +--- + +## Development + +```sh +# Install dependencies +npm install + +# Run tests +npm test + +# Run tests in watch mode +npm run watch + +# Check formatting and linting +npm run format:check + +# Auto-fix formatting and linting +npm run format +``` + +--- + +## License + +BSD-3-Clause © [Matt Simerson](https://github.com/msimerson) diff --git a/package.json b/package.json index 4cfd384..6a1fd66 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "nictool", - "version": "0.0.1", + "version": "0.0.2", "description": "NicTool, the DNS manager", "main": "index.js", "type": "module", @@ -40,11 +40,16 @@ }, "homepage": "https://github.com/NicTool/server#readme", "dependencies": { - "joi": "^18.1.1", - "@nictool/api": "^3.0.0-alpha.10", - "@nictool/dns-nameserver": "^0.7.3", + "joi": "^18.1.2", + "@nictool/api": "^3.0.0-alpha.11", + "@nictool/dns-nameserver": "^0.7.4", "@nictool/dns-resource-record": "^1.6.0", - "@nictool/dns-zone": "^1.1.7", + "@nictool/dns-zone": "^1.1.8", "smol-toml": "^1.6.1" + }, + "prettier": { + "printWidth": 90, + "singleQuote": true, + "semi": false } -} +} \ No newline at end of file