diff --git a/Dockerfile b/Dockerfile index ae59c9f..68667fa 100644 --- a/Dockerfile +++ b/Dockerfile @@ -33,7 +33,9 @@ RUN CGO_ENABLED=0 go build -trimpath -ldflags="-s -w" -o /chat-cli ./cmd/chat-cl # alpine:3.21, 2026-02-26 FROM alpine@sha256:c3f8e73fdb79deaebaa2037150150191b9dcbfba68b4a46d70103204c53f4709 RUN apk add --no-cache ca-certificates \ - && addgroup -S chat && adduser -S chat -G chat + && addgroup -S chat && adduser -S chat -G chat \ + && mkdir -p /var/lib/neoirc \ + && chown chat:chat /var/lib/neoirc COPY --from=builder /chatd /usr/local/bin/chatd USER chat diff --git a/Makefile b/Makefile index 4a5ca28..a25d89e 100644 --- a/Makefile +++ b/Makefile @@ -37,7 +37,7 @@ debug: build DEBUG=1 GOTRACEBACK=all ./bin/$(BINARY) clean: - rm -rf bin/ chatd data.db + rm -rf bin/ chatd docker: docker build -t chat . diff --git a/README.md b/README.md index 04d019f..8315bb2 100644 --- a/README.md +++ b/README.md @@ -1645,7 +1645,7 @@ directory is also loaded automatically via | Variable | Type | Default | Description | |--------------------|---------|--------------------------------------|-------------| | `PORT` | int | `8080` | HTTP listen port | -| `DBURL` | string | `file:./data.db?_journal_mode=WAL` | SQLite connection string. For file-based: `file:./path.db?_journal_mode=WAL`. For in-memory (testing): `file::memory:?cache=shared`. | +| `DBURL` | string | `file:///var/lib/neoirc/state.db?_journal_mode=WAL` | SQLite connection string. For file-based: `file:///path/to/db.db?_journal_mode=WAL`. For in-memory (testing): `file::memory:?cache=shared`. | | `DEBUG` | bool | `false` | Enable debug logging (verbose request/response logging) | | `MAX_HISTORY` | int | `10000` | Maximum messages retained per channel before rotation (planned) | | `SESSION_IDLE_TIMEOUT` | string | `24h` | Session idle timeout as a Go duration string (e.g. `24h`, `30m`). Sessions with no activity for this long are expired and the nick is released. | @@ -1667,7 +1667,7 @@ PORT=8080 SERVER_NAME=My Chat Server MOTD=Welcome! Be excellent to each other. DEBUG=false -DBURL=file:./data.db?_journal_mode=WAL +DBURL=file:///var/lib/neoirc/state.db?_journal_mode=WAL SESSION_IDLE_TIMEOUT=24h ``` @@ -1685,8 +1685,7 @@ docker build -t chat . # Run docker run -p 8080:8080 \ - -v chat-data:/data \ - -e DBURL="file:/data/chat.db?_journal_mode=WAL" \ + -v chat-data:/var/lib/neoirc \ -e SERVER_NAME="My Server" \ -e MOTD="Welcome!" \ chat @@ -1722,7 +1721,7 @@ make build # Run ./bin/chatd -# Listens on :8080, creates ./data.db +# Listens on :8080, writes to /var/lib/neoirc/state.db ``` ### Reverse Proxy (Production) @@ -1763,8 +1762,8 @@ seconds to accommodate long-poll connections. string). This allows concurrent reads during writes. - **Single writer**: SQLite allows only one writer at a time. For high-traffic servers, Postgres support is planned. -- **Backup**: The database is a single file. Back it up with `sqlite3 data.db ".backup backup.db"` or just copy the file (safe with WAL mode). -- **Location**: By default, `data.db` is created in the working directory. +- **Backup**: The database is a single file. Back it up with `sqlite3 /var/lib/neoirc/state.db ".backup backup.db"` or just copy the file (safe with WAL mode). +- **Location**: By default, `state.db` is created in `/var/lib/neoirc/`. Use the `DBURL` env var to place it elsewhere. --- diff --git a/cmd/chatd/main.go b/cmd/chatd/main.go index 8fa7e08..779594a 100644 --- a/cmd/chatd/main.go +++ b/cmd/chatd/main.go @@ -15,7 +15,7 @@ import ( var ( // Appname is the application name, set at build time. - Appname = "chat" //nolint:gochecknoglobals + Appname = "neoirc" //nolint:gochecknoglobals // Version is the application version, set at build time. Version string //nolint:gochecknoglobals diff --git a/internal/config/config.go b/internal/config/config.go index bdf5835..f2b4308 100644 --- a/internal/config/config.go +++ b/internal/config/config.go @@ -56,7 +56,7 @@ func New( viper.SetDefault("DEBUG", "false") viper.SetDefault("MAINTENANCE_MODE", "false") viper.SetDefault("PORT", "8080") - viper.SetDefault("DBURL", "file:./data.db?_journal_mode=WAL") + viper.SetDefault("DBURL", "file:///var/lib/neoirc/state.db?_journal_mode=WAL") viper.SetDefault("SENTRY_DSN", "") viper.SetDefault("METRICS_USERNAME", "") viper.SetDefault("METRICS_PASSWORD", "") diff --git a/internal/db/db.go b/internal/db/db.go index 20ed77a..41aeee5 100644 --- a/internal/db/db.go +++ b/internal/db/db.go @@ -87,7 +87,7 @@ func (database *Database) GetDB() *sql.DB { func (database *Database) connect(ctx context.Context) error { dbURL := database.params.Config.DBURL if dbURL == "" { - dbURL = "file:./data.db?_journal_mode=WAL&_busy_timeout=5000" + dbURL = "file:///var/lib/neoirc/state.db?_journal_mode=WAL&_busy_timeout=5000" } database.log.Info(