Establish Phase 1 Atlas infrastructure repository
This commit is contained in:
commit
451b5b28d7
104
.gitignore
vendored
Normal file
104
.gitignore
vendored
Normal file
@ -0,0 +1,104 @@
|
||||
# Secrets and environment files
|
||||
.env
|
||||
.env.*
|
||||
!.env.example
|
||||
!.env.*.example
|
||||
*.secret
|
||||
*.secrets
|
||||
secrets/
|
||||
credentials/
|
||||
local-secrets/
|
||||
|
||||
# Private keys and certificates
|
||||
*.key
|
||||
*.pem
|
||||
*.p12
|
||||
*.pfx
|
||||
*.crt
|
||||
*.csr
|
||||
*.jks
|
||||
id_rsa
|
||||
id_rsa.*
|
||||
id_ed25519
|
||||
id_ed25519.*
|
||||
*_rsa
|
||||
*_rsa.*
|
||||
*_ed25519
|
||||
*_ed25519.*
|
||||
|
||||
# Local overrides
|
||||
*.local
|
||||
*.local.*
|
||||
local/
|
||||
overrides/
|
||||
*.override
|
||||
*.override.*
|
||||
|
||||
# Logs
|
||||
*.log
|
||||
logs/
|
||||
log/
|
||||
|
||||
# Temporary files
|
||||
tmp/
|
||||
temp/
|
||||
*.tmp
|
||||
*.temp
|
||||
*.swp
|
||||
*.swo
|
||||
*~
|
||||
.cache/
|
||||
|
||||
# Build outputs and dependencies
|
||||
bin/
|
||||
obj/
|
||||
build/
|
||||
out/
|
||||
dist/
|
||||
publish/
|
||||
coverage/
|
||||
node_modules/
|
||||
.next/
|
||||
.nuxt/
|
||||
|
||||
# Deployment artefacts and archives
|
||||
artifacts/
|
||||
artefacts/
|
||||
deployments/
|
||||
releases/
|
||||
*.zip
|
||||
*.tar
|
||||
*.tar.gz
|
||||
*.tgz
|
||||
*.7z
|
||||
|
||||
# Backup artefacts and database dumps
|
||||
/backups/
|
||||
/backup/
|
||||
*.bak
|
||||
*.trn
|
||||
*.bacpac
|
||||
*.dacpac
|
||||
*.dump
|
||||
*.sql.gz
|
||||
*.sql.zip
|
||||
|
||||
# Package caches
|
||||
.npm/
|
||||
.pnpm-store/
|
||||
.yarn/
|
||||
.pip-cache/
|
||||
vendor/cache/
|
||||
packages/
|
||||
*.deb
|
||||
*.rpm
|
||||
|
||||
# IDE and editor metadata
|
||||
.vscode/
|
||||
.idea/
|
||||
*.code-workspace
|
||||
|
||||
# OS metadata
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
desktop.ini
|
||||
9
CHANGELOG.md
Normal file
9
CHANGELOG.md
Normal file
@ -0,0 +1,9 @@
|
||||
# Changelog
|
||||
|
||||
All notable changes to this repository will be documented in this file.
|
||||
|
||||
## Unreleased
|
||||
|
||||
- Created the Phase 1 repository structure for `atlas`.
|
||||
- Added baseline documentation for architecture, operating model, rebuild, disaster recovery, and server standards.
|
||||
- Added the first Architecture Decision Record.
|
||||
110
README.md
Normal file
110
README.md
Normal file
@ -0,0 +1,110 @@
|
||||
# Atlas AI Development Server
|
||||
|
||||
Atlas is a dedicated AI development server used as the primary Linux host for source code, automation, development tooling, operational scripts, and future application deployment work.
|
||||
|
||||
This repository is the authoritative infrastructure and operations source for Atlas. Its long-term purpose is to make the server rebuildable from a clean Ubuntu installation using documented, version-controlled, idempotent automation.
|
||||
|
||||
## Current Server Summary
|
||||
|
||||
The following facts are established for the current server:
|
||||
|
||||
- Hostname: `atlas`
|
||||
- Operating system: Ubuntu 26.04 LTS
|
||||
- Static IP address: `192.168.10.10`
|
||||
- CPU: AMD Ryzen 7 2700
|
||||
- Memory: 16 GB RAM
|
||||
- OS storage: SSD using full-disk LVM, mounted at `/`
|
||||
- SQL data volume: SSD mounted at `/sql`
|
||||
- Development volume: SSD mounted at `/srv`
|
||||
- Repository location: `/srv/repos/AI-Development-Server`
|
||||
- Git remote: `git@git.catherinelynwood.com:atlas-bot/AI-Development-Server.git`
|
||||
|
||||
Do not add unverified server details to this repository. Use `TODO: Confirm during the relevant implementation phase.` where information is not yet established.
|
||||
|
||||
## Repository Purpose
|
||||
|
||||
This repository will contain:
|
||||
|
||||
- Atlas architecture and operating documentation.
|
||||
- Server standards for scripts, services, configuration, deployment, and change control.
|
||||
- Installation automation.
|
||||
- Configuration templates.
|
||||
- Operational scripts.
|
||||
- Smoke tests and validation checks.
|
||||
- Recovery and rebuild runbooks.
|
||||
- Architecture Decision Records.
|
||||
- Build history.
|
||||
|
||||
It must not contain secrets, passwords, tokens, private keys, live credentials, database backups, generated deployment artefacts, or local machine state.
|
||||
|
||||
## Design Principles
|
||||
|
||||
- Git is the source of truth for infrastructure and operational intent.
|
||||
- Changes should be documented before they are automated.
|
||||
- Installation scripts must be idempotent and safe to rerun.
|
||||
- Manual server changes should be reduced over time and recorded when they occur.
|
||||
- Source, build artefacts, deployed applications, data, backups, and temporary files must remain separate.
|
||||
- Secrets must live outside the repository.
|
||||
- Planned components must not be documented as installed until verified.
|
||||
|
||||
## Repository Layout
|
||||
|
||||
```text
|
||||
.
|
||||
├── README.md
|
||||
├── SERVER-STANDARDS.md
|
||||
├── docs/
|
||||
│ ├── ARCHITECTURE.md
|
||||
│ ├── BUILD-LOG.md
|
||||
│ ├── REBUILD-GUIDE.md
|
||||
│ ├── DISASTER-RECOVERY.md
|
||||
│ ├── OPERATING-MODEL.md
|
||||
│ └── adr/
|
||||
├── install/
|
||||
├── config/
|
||||
├── scripts/
|
||||
├── tests/
|
||||
├── templates/
|
||||
└── .gitignore
|
||||
```
|
||||
|
||||
Directory-level README files explain what belongs in each working area.
|
||||
|
||||
## Future Installation Model
|
||||
|
||||
Future installation scripts will live under `install/`. They will be ordered, idempotent Bash scripts, for example:
|
||||
|
||||
```text
|
||||
install/01-base-tools.sh
|
||||
install/02-dotnet.sh
|
||||
install/03-sqlserver.sh
|
||||
install/04-nginx.sh
|
||||
install/05-docker.sh
|
||||
```
|
||||
|
||||
These scripts do not exist yet. Until they do, rebuild steps remain manual and are documented in [docs/REBUILD-GUIDE.md](docs/REBUILD-GUIDE.md).
|
||||
|
||||
## Change Control
|
||||
|
||||
- Plan architecture and standards changes before implementation.
|
||||
- Review diffs before committing.
|
||||
- Run relevant validation before commit.
|
||||
- Do not commit without explicit approval.
|
||||
- Keep commits focused on one infrastructure outcome.
|
||||
- Record meaningful operational changes in [docs/BUILD-LOG.md](docs/BUILD-LOG.md).
|
||||
|
||||
## Roadmap Summary
|
||||
|
||||
- Phase 1: Establish repository structure, standards, architecture documentation, rebuild guidance, disaster recovery guidance, operating model, and ADR process.
|
||||
- Future phases: Add idempotent installation scripts, configuration templates, operational scripts, smoke tests, backup automation, restore automation, deployment automation, and monitoring.
|
||||
|
||||
## Security Warning
|
||||
|
||||
Never commit secrets or credentials. This includes `.env` files, passwords, tokens, private keys, certificates, SQL backups, Codex authentication material, deployment credentials, and backup encryption keys.
|
||||
|
||||
Use templates, examples, placeholder names, and documented environment variable names instead.
|
||||
|
||||
## Rebuild and Recovery
|
||||
|
||||
- Rebuild procedure: [docs/REBUILD-GUIDE.md](docs/REBUILD-GUIDE.md)
|
||||
- Disaster recovery: [docs/DISASTER-RECOVERY.md](docs/DISASTER-RECOVERY.md)
|
||||
179
SERVER-STANDARDS.md
Normal file
179
SERVER-STANDARDS.md
Normal file
@ -0,0 +1,179 @@
|
||||
# Server Standards
|
||||
|
||||
These standards apply to infrastructure documentation, installation scripts, operational scripts, configuration templates, tests, and manual server changes for Atlas.
|
||||
|
||||
Unknowns must be written exactly as `TODO: Confirm during the relevant implementation phase.`
|
||||
|
||||
## Bash Script Conventions
|
||||
|
||||
- Use Bash for repository-managed server automation unless a better tool is explicitly adopted by an ADR.
|
||||
- Start executable scripts with `#!/usr/bin/env bash`.
|
||||
- Use `set -Eeuo pipefail`.
|
||||
- Prefer explicit named variables over positional parameters.
|
||||
- Quote variable expansions unless word splitting is intentional.
|
||||
- Keep functions small and named by behaviour.
|
||||
- Use long option names where they improve readability.
|
||||
- Avoid hidden dependencies on the current working directory. Resolve paths explicitly.
|
||||
- Place shared helpers only when repeated logic justifies them.
|
||||
|
||||
## Idempotency
|
||||
|
||||
- Scripts must be safe to run more than once.
|
||||
- Check current state before making changes.
|
||||
- Prefer create-or-update behaviour over delete-and-recreate behaviour.
|
||||
- Do not assume users, packages, directories, mounts, services, firewall rules, or configuration files are absent.
|
||||
- Print a clear message when a step is already satisfied.
|
||||
- Avoid overwriting local state unless the script owns that file and has a documented rollback path.
|
||||
|
||||
## Error Handling
|
||||
|
||||
- Fail early when prerequisites are missing.
|
||||
- Use meaningful error messages that identify the failed operation.
|
||||
- Do not continue after a failed critical step.
|
||||
- Use traps when cleanup or failure context is useful.
|
||||
- Validate inputs before making changes.
|
||||
- Treat unset variables as errors.
|
||||
|
||||
## Logging
|
||||
|
||||
- Print concise progress messages.
|
||||
- Use consistent prefixes: `[INFO]`, `[WARN]`, `[ERROR]`, `[OK]`.
|
||||
- Do not print secrets, tokens, passwords, connection strings, private keys, or certificate material.
|
||||
- Long-term logs must be stored outside this repository.
|
||||
- Repository scripts may write temporary logs only under documented temporary paths and must clean them up where practical.
|
||||
|
||||
## Exit Codes
|
||||
|
||||
- `0`: success.
|
||||
- `1`: general failure.
|
||||
- `2`: invalid arguments or missing required input.
|
||||
- `3`: unmet prerequisite.
|
||||
- `4`: validation failed.
|
||||
- `5`: unsafe state detected.
|
||||
|
||||
## File Ownership and Permissions
|
||||
|
||||
- Repository files should be owned by the dedicated development user.
|
||||
- Use executable permissions only for scripts intended to be run directly.
|
||||
- Use root ownership only for system files that require it.
|
||||
- Do not change ownership recursively outside documented paths.
|
||||
- Secrets outside the repository must use the narrowest practical permissions.
|
||||
- Templates in the repository must not contain live secrets.
|
||||
|
||||
## Configuration Locations
|
||||
|
||||
- Repository-managed templates belong under `config/` or `templates/`.
|
||||
- Generated or live service configuration belongs in the service's normal system location, usually under `/etc`, and should be produced from repository templates where practical.
|
||||
- Local overrides must not be committed.
|
||||
- Application-specific paths must not be locked in until the relevant implementation phase confirms them.
|
||||
|
||||
## Service Naming
|
||||
|
||||
- Use clear, stable service names.
|
||||
- Prefer names that identify the application or function rather than the implementation detail.
|
||||
- Prefix Atlas-specific helper services consistently when a naming convention is established.
|
||||
- Avoid renaming services without a migration and rollback note.
|
||||
- Service naming convention: `TODO: Confirm during the relevant implementation phase.`
|
||||
|
||||
## systemd Conventions
|
||||
|
||||
- Store systemd unit templates under `config/systemd/` or `templates/` when introduced.
|
||||
- Install live units under the appropriate systemd directory only through documented scripts.
|
||||
- Run `systemctl daemon-reload` after unit changes.
|
||||
- Enable services only when the intended boot behaviour is documented.
|
||||
- Prefer environment files outside the repository for secret-bearing configuration.
|
||||
- Include validation steps for service status and logs.
|
||||
|
||||
## nginx Conventions
|
||||
|
||||
- Store nginx templates under `config/nginx/` or `templates/` when introduced.
|
||||
- Do not commit live TLS private keys or certificates.
|
||||
- Validate nginx configuration before reloads.
|
||||
- Reload nginx only after successful validation.
|
||||
- Keep reverse proxy rules explicit and reviewed.
|
||||
- Public DNS, TLS, and exposure policy: `TODO: Confirm during the relevant implementation phase.`
|
||||
|
||||
## SQL Server Data Locations
|
||||
|
||||
- `/sql` is the intended SQL data volume.
|
||||
- SQL Server data, logs, and backups must not be stored in this repository.
|
||||
- SQL Server paths must be confirmed during the SQL Server implementation phase before automation is created.
|
||||
- Backup destination, retention, encryption, and restore validation are not yet established.
|
||||
|
||||
## Repository Locations
|
||||
|
||||
- `/srv` is the primary development volume.
|
||||
- Git repositories should live under `/srv/repos`.
|
||||
- This infrastructure repository lives at `/srv/repos/AI-Development-Server`.
|
||||
- Do not assume application repository names or paths until they are confirmed.
|
||||
|
||||
## Deployment Locations
|
||||
|
||||
- Deployment locations must be outside this infrastructure repository.
|
||||
- Deployed applications should be separated from source repositories and build artefacts.
|
||||
- Intended deployment root: `TODO: Confirm during the relevant implementation phase.`
|
||||
- Deployment scripts must document rollback and validation.
|
||||
|
||||
## Backup Locations
|
||||
|
||||
- Backups must not be committed.
|
||||
- Backup storage location: `TODO: Confirm during the relevant implementation phase.`
|
||||
- Backup retention: `TODO: Confirm during the relevant implementation phase.`
|
||||
- Backup encryption: `TODO: Confirm during the relevant implementation phase.`
|
||||
- Restore testing schedule: `TODO: Confirm during the relevant implementation phase.`
|
||||
|
||||
## Temporary File Handling
|
||||
|
||||
- Use `mktemp` for script-created temporary files and directories.
|
||||
- Clean temporary files on exit where practical.
|
||||
- Do not place temporary files in the repository unless they are intentionally version-controlled examples.
|
||||
- Never store secret-bearing temporary files in world-readable locations.
|
||||
|
||||
## Secrets Management
|
||||
|
||||
- Never commit live secrets, tokens, passwords, private keys, SQL backups, `.env` files, generated credentials, or Codex authentication material.
|
||||
- Use `.example`, `.template`, placeholder values, or documented environment variable names.
|
||||
- Store secret-bearing live configuration outside the repository.
|
||||
- Rotate credentials after suspected exposure.
|
||||
- Secret storage mechanism: `TODO: Confirm during the relevant implementation phase.`
|
||||
|
||||
## Package Installation
|
||||
|
||||
- Installation scripts must use the system package manager where practical.
|
||||
- Add third-party package repositories only when documented and justified.
|
||||
- Validate repository signing keys and sources.
|
||||
- Avoid installing packages in ad hoc scripts without recording why they are needed.
|
||||
- Do not install application dependencies globally unless required.
|
||||
|
||||
## Version Pinning
|
||||
|
||||
- Pin versions when reproducibility, compatibility, or security requires it.
|
||||
- Document why a version is pinned and when it should be reviewed.
|
||||
- If using latest available packages, document that choice.
|
||||
- Do not record planned component versions as installed until verified.
|
||||
|
||||
## Testing Requirements
|
||||
|
||||
- Add smoke tests for scripts that change services, network state, mounts, databases, deployments, or backup behaviour.
|
||||
- Tests should verify observable outcomes, not only exit codes.
|
||||
- Tests must avoid requiring secrets where practical.
|
||||
- Tests must not mutate production data unless explicitly designed and approved.
|
||||
- Run relevant tests before committing.
|
||||
|
||||
## Documentation Requirements
|
||||
|
||||
- Update documentation with every change that affects rebuild, operation, security, backup, restore, deployment, or architecture.
|
||||
- Update [docs/BUILD-LOG.md](docs/BUILD-LOG.md) for meaningful manual or automated infrastructure milestones.
|
||||
- Update runbooks when manual steps become automated.
|
||||
- Link related ADRs where decisions are recorded.
|
||||
- Use UK English.
|
||||
|
||||
## Change Control
|
||||
|
||||
- Plan substantial changes before implementation.
|
||||
- Human approval is required for architecture changes.
|
||||
- Review `git diff` before commit.
|
||||
- Do not commit without explicit approval.
|
||||
- Keep commits focused and reversible.
|
||||
- Document rollback expectations for risky changes.
|
||||
- Git rollback restores repository state only. It does not automatically undo server changes already applied.
|
||||
43
config/README.md
Normal file
43
config/README.md
Normal file
@ -0,0 +1,43 @@
|
||||
# Config
|
||||
|
||||
This directory is for repository-managed service configuration templates and configuration examples for Atlas.
|
||||
|
||||
## What Belongs Here
|
||||
|
||||
- nginx templates.
|
||||
- systemd unit templates.
|
||||
- SQL Server configuration templates.
|
||||
- Non-secret example configuration.
|
||||
- Documented placeholders for environment variables.
|
||||
|
||||
## What Must Not Be Stored Here
|
||||
|
||||
- Live configuration containing secrets.
|
||||
- `.env` files.
|
||||
- Private keys.
|
||||
- TLS private keys or live certificates.
|
||||
- Database backups.
|
||||
- Machine-local overrides.
|
||||
|
||||
## Naming Conventions
|
||||
|
||||
- Use lower-case directory names.
|
||||
- Use lower-case hyphenated file names.
|
||||
- Use `.template`, `.example`, or `.sample` for files that are not live configuration.
|
||||
- Use clear placeholder names such as `CHANGE_ME` or `${ENV_VAR_NAME}`.
|
||||
|
||||
## Expected Future Structure
|
||||
|
||||
Current planned areas include:
|
||||
|
||||
```text
|
||||
config/nginx/
|
||||
config/sqlserver/
|
||||
config/systemd/
|
||||
```
|
||||
|
||||
Additional service directories may be added when those services are implemented.
|
||||
|
||||
## Security Considerations
|
||||
|
||||
Configuration templates must not contain live secrets. Secret-bearing live files should be stored outside the repository and referenced by documented paths or environment variable names.
|
||||
1
config/nginx/.gitkeep
Normal file
1
config/nginx/.gitkeep
Normal file
@ -0,0 +1 @@
|
||||
|
||||
1
config/sqlserver/.gitkeep
Normal file
1
config/sqlserver/.gitkeep
Normal file
@ -0,0 +1 @@
|
||||
|
||||
1
config/systemd/.gitkeep
Normal file
1
config/systemd/.gitkeep
Normal file
@ -0,0 +1 @@
|
||||
|
||||
1
config/templates/.gitkeep
Normal file
1
config/templates/.gitkeep
Normal file
@ -0,0 +1 @@
|
||||
|
||||
193
docs/ARCHITECTURE.md
Normal file
193
docs/ARCHITECTURE.md
Normal file
@ -0,0 +1,193 @@
|
||||
# Atlas Architecture
|
||||
|
||||
This document separates confirmed current architecture from planned architecture. Do not describe planned components as installed until they have been verified.
|
||||
|
||||
## Current Architecture
|
||||
|
||||
Atlas is a single physical development server.
|
||||
|
||||
### Physical Server Overview
|
||||
|
||||
- Hostname: `atlas`
|
||||
- Operating system: Ubuntu 26.04 LTS
|
||||
- Hardware model: ASUS PRIME B450-PLUS
|
||||
- CPU: AMD Ryzen 7 2700
|
||||
- Memory: 16 GB RAM
|
||||
- Architecture: x86-64
|
||||
- Role: AI development server and infrastructure automation host
|
||||
|
||||
### Storage Layout
|
||||
|
||||
- OS volume: SSD using LVM, mounted at `/`
|
||||
- SQL data volume: SSD mounted at `/sql`
|
||||
- Development volume: SSD mounted at `/srv`
|
||||
- Repository root: `/srv/repos`
|
||||
- Infrastructure repository: `/srv/repos/AI-Development-Server`
|
||||
|
||||
The intended model separates operating system state, SQL data, and development data. This supports rebuild and recovery by reducing reliance on the OS volume for mutable project data.
|
||||
|
||||
### Network Identity
|
||||
|
||||
- Hostname: `atlas`
|
||||
- Static IP address: `192.168.10.10`
|
||||
- Default gateway: `192.168.10.1`
|
||||
- Primary network interface: `enp3s0`
|
||||
- Gitea SSH remote for this repository: `git@git.catherinelynwood.com:atlas-bot/AI-Development-Server.git`
|
||||
|
||||
DNS, firewall, public exposure, and TLS policy are `TODO: Confirm during the relevant implementation phase.`
|
||||
|
||||
### Repository and Source-Control Flow
|
||||
|
||||
Git is the source of truth for repository state. Atlas holds the working copy under `/srv/repos/AI-Development-Server`, and Gitea is the remote source-control system for this infrastructure repository.
|
||||
|
||||
Expected flow:
|
||||
|
||||
1. Plan infrastructure changes in documentation.
|
||||
2. Implement scripts, templates, or documentation updates.
|
||||
3. Validate locally on Atlas.
|
||||
4. Review the full diff.
|
||||
5. Commit only after explicit approval.
|
||||
6. Push reviewed commits to Gitea.
|
||||
|
||||
Branching policy is `TODO: Confirm during the relevant implementation phase.`
|
||||
|
||||
## Planned Architecture
|
||||
|
||||
The repository is intended to grow into the version-controlled control plane for Atlas. Planned components include:
|
||||
|
||||
- Idempotent installation scripts under `install/`.
|
||||
- Managed configuration templates under `config/` and `templates/`.
|
||||
- Operational scripts under `scripts/`.
|
||||
- Smoke tests under `tests/`.
|
||||
- Rebuild and recovery procedures under `docs/`.
|
||||
- Architecture Decision Records under `docs/adr/`.
|
||||
|
||||
### Intended Development Platform Components
|
||||
|
||||
Atlas is intended to support:
|
||||
|
||||
- Codex CLI usage.
|
||||
- Git and Git LFS workflows.
|
||||
- Node.js-based tooling where required.
|
||||
- .NET SDKs when application requirements are confirmed.
|
||||
- SQL Server when the database phase is implemented.
|
||||
- nginx when reverse proxy requirements are confirmed.
|
||||
- Docker when runtime policy is confirmed.
|
||||
- Backup, restore, monitoring, and maintenance automation.
|
||||
|
||||
Only components verified during implementation should be recorded as installed.
|
||||
|
||||
### Intended PlotDirector Deployment Topology
|
||||
|
||||
PlotDirector deployment topology is not yet established.
|
||||
|
||||
Current assumptions:
|
||||
|
||||
- Source repositories should live under `/srv/repos`.
|
||||
- Build artefacts should be generated outside this infrastructure repository.
|
||||
- Deployed applications should be separated from source repositories.
|
||||
- SQL data should use `/sql` once SQL Server paths are confirmed.
|
||||
- nginx may act as the reverse proxy if the application is exposed over HTTP or HTTPS.
|
||||
- Docker may host one or more services if containerisation is adopted.
|
||||
|
||||
Specific PlotDirector service names, ports, deployment paths, database names, and rollback procedures are `TODO: Confirm during the relevant implementation phase.`
|
||||
|
||||
### Role of nginx
|
||||
|
||||
nginx is planned as the likely local reverse proxy for HTTP and HTTPS applications. Its future responsibilities may include:
|
||||
|
||||
- Routing requests to application services.
|
||||
- TLS termination.
|
||||
- Static file serving where appropriate.
|
||||
- Request size, timeout, and header policy.
|
||||
|
||||
nginx installation, site layout, TLS certificate handling, and exposure rules are `TODO: Confirm during the relevant implementation phase.`
|
||||
|
||||
### Role of SQL Server
|
||||
|
||||
SQL Server is planned as the relational database platform for applications that require it. `/sql` is the intended data volume.
|
||||
|
||||
SQL Server version, data paths, backup paths, service account model, authentication policy, maintenance jobs, and restore process are `TODO: Confirm during the relevant implementation phase.`
|
||||
|
||||
### Role of Docker
|
||||
|
||||
Docker is planned as a possible application runtime and tooling boundary. It should be introduced only after the runtime policy is documented.
|
||||
|
||||
Docker installation method, user access policy, network policy, volume locations, image retention, and compose layout are `TODO: Confirm during the relevant implementation phase.`
|
||||
|
||||
## Separation of Concerns
|
||||
|
||||
The intended storage and responsibility model is:
|
||||
|
||||
- Source repositories: `/srv/repos`
|
||||
- Infrastructure repository: `/srv/repos/AI-Development-Server`
|
||||
- Build artefacts: `TODO: Confirm during the relevant implementation phase.`
|
||||
- Deployed applications: `TODO: Confirm during the relevant implementation phase.`
|
||||
- SQL data: `/sql`
|
||||
- Backups: `TODO: Confirm during the relevant implementation phase.`
|
||||
- Temporary files: system temporary locations or script-created `mktemp` paths
|
||||
- Live secrets: outside this repository
|
||||
|
||||
## Trust Boundaries
|
||||
|
||||
Known trust boundaries:
|
||||
|
||||
- Atlas local OS user accounts.
|
||||
- SSH access to Atlas.
|
||||
- SSH access from Atlas to Gitea.
|
||||
- Root-level operations performed through `sudo`.
|
||||
- Repository content versus live secret-bearing configuration.
|
||||
- SQL data on `/sql` versus source and scripts on `/srv`.
|
||||
- Future public-facing application traffic through nginx, if enabled.
|
||||
|
||||
Unresolved trust-boundary details:
|
||||
|
||||
- Firewall policy: `TODO: Confirm during the relevant implementation phase.`
|
||||
- Production access model: `TODO: Confirm during the relevant implementation phase.`
|
||||
- Secret storage model: `TODO: Confirm during the relevant implementation phase.`
|
||||
- Backup encryption model: `TODO: Confirm during the relevant implementation phase.`
|
||||
|
||||
## High-Level Diagram
|
||||
|
||||
```mermaid
|
||||
flowchart TB
|
||||
Nick[Nick] -->|reviews plans and diffs| Git[Gitea Remote]
|
||||
ChatGPT[ChatGPT] -->|planning and review support| Nick
|
||||
Codex[Codex CLI on Atlas] -->|implements approved changes| Repo
|
||||
Git <--> Repo[Infrastructure repository<br>/srv/repos/AI-Development-Server]
|
||||
|
||||
subgraph Atlas[atlas<br>Ubuntu 26.04 LTS<br>192.168.10.10]
|
||||
Repo
|
||||
Source[Application source repositories<br>/srv/repos]
|
||||
Install[Future install automation<br>install/]
|
||||
Config[Future config templates<br>config/ and templates/]
|
||||
Scripts[Future operational scripts<br>scripts/]
|
||||
Tests[Future smoke tests<br>tests/]
|
||||
SQL[(SQL data volume<br>/sql)]
|
||||
Deploy[Future deployed applications]
|
||||
Nginx[Future nginx reverse proxy]
|
||||
Docker[Future Docker runtime]
|
||||
end
|
||||
|
||||
Repo --> Install
|
||||
Repo --> Config
|
||||
Repo --> Scripts
|
||||
Repo --> Tests
|
||||
Source --> Deploy
|
||||
Deploy --> SQL
|
||||
Nginx --> Deploy
|
||||
Docker --> Deploy
|
||||
```
|
||||
|
||||
## Decisions Not Yet Made
|
||||
|
||||
- Backup destination, schedule, retention, encryption, and restore testing.
|
||||
- SQL Server version, installation method, and data layout.
|
||||
- nginx site layout, TLS model, and exposure policy.
|
||||
- Docker installation method and runtime policy.
|
||||
- PlotDirector topology, service names, ports, paths, and rollback process.
|
||||
- Monitoring stack and alerting channels.
|
||||
- Branching and release policy.
|
||||
- CI model.
|
||||
- Firewall policy.
|
||||
- Production access model.
|
||||
102
docs/BUILD-LOG.md
Normal file
102
docs/BUILD-LOG.md
Normal file
@ -0,0 +1,102 @@
|
||||
# Build Log
|
||||
|
||||
This file records chronological Atlas build and infrastructure milestones. Do not fabricate dates, command output, validation results, or operator names.
|
||||
|
||||
## Entries
|
||||
|
||||
### Date
|
||||
|
||||
Not recorded.
|
||||
|
||||
### Phase
|
||||
|
||||
Baseline server preparation before Phase 1 repository completion.
|
||||
|
||||
### Objective
|
||||
|
||||
Prepare Atlas as a dedicated AI development server with storage, network, SSH, Git, Gitea access, Codex CLI, and standard development utilities.
|
||||
|
||||
### Changes
|
||||
|
||||
- Ubuntu 26.04 LTS installed.
|
||||
- Hostname set to `atlas`.
|
||||
- Static IP configured as `192.168.10.10`.
|
||||
- OS SSD configured with full-disk LVM.
|
||||
- OS logical volume expanded to use available LVM capacity.
|
||||
- SQL SSD mounted at `/sql`.
|
||||
- Development SSD mounted at `/srv`.
|
||||
- SSH access configured.
|
||||
- Gitea SSH authentication configured.
|
||||
- Git installed.
|
||||
- Git LFS installed.
|
||||
- Node.js installed.
|
||||
- Standard development utilities installed.
|
||||
- Codex CLI installed and authenticated.
|
||||
- Codex full-access mode configured with no approval prompts.
|
||||
- Passwordless sudo configured for the dedicated development user.
|
||||
- Infrastructure repository created and cloned at `/srv/repos/AI-Development-Server`.
|
||||
|
||||
### Validation
|
||||
|
||||
- Server identity and storage were later inspected during Phase 1 planning.
|
||||
- Repository remote was later inspected during Phase 1 planning.
|
||||
- Original command output was not captured in this repository.
|
||||
|
||||
### Problems
|
||||
|
||||
- No baseline problems were recorded in this repository.
|
||||
|
||||
### Decisions
|
||||
|
||||
- Atlas will use this repository as the authoritative infrastructure and operations source.
|
||||
- Atlas will be rebuilt over time through documented, version-controlled, idempotent automation.
|
||||
|
||||
### Git Commit
|
||||
|
||||
Not yet committed.
|
||||
|
||||
### Operator
|
||||
|
||||
TODO: Confirm during the relevant implementation phase.
|
||||
|
||||
## Entry Template
|
||||
|
||||
Copy this template for future entries.
|
||||
|
||||
```markdown
|
||||
### Date
|
||||
|
||||
YYYY-MM-DD
|
||||
|
||||
### Phase
|
||||
|
||||
Phase name or number.
|
||||
|
||||
### Objective
|
||||
|
||||
What this work was intended to achieve.
|
||||
|
||||
### Changes
|
||||
|
||||
- Change made.
|
||||
|
||||
### Validation
|
||||
|
||||
- Validation performed.
|
||||
|
||||
### Problems
|
||||
|
||||
- Problem encountered, or `None recorded.`
|
||||
|
||||
### Decisions
|
||||
|
||||
- Decision made, or `None recorded.`
|
||||
|
||||
### Git Commit
|
||||
|
||||
Commit hash, or `Not yet committed.`
|
||||
|
||||
### Operator
|
||||
|
||||
Name or role.
|
||||
```
|
||||
283
docs/DISASTER-RECOVERY.md
Normal file
283
docs/DISASTER-RECOVERY.md
Normal file
@ -0,0 +1,283 @@
|
||||
# Disaster Recovery
|
||||
|
||||
This document defines expected recovery scenarios for Atlas. It does not claim that backups currently exist unless they have been verified.
|
||||
|
||||
Backup destination, retention, encryption, restore testing, and ownership are `TODO: Confirm during the relevant implementation phase.`
|
||||
|
||||
## Recovery Principles
|
||||
|
||||
- Protect source repositories and infrastructure history first.
|
||||
- Keep secrets outside this repository.
|
||||
- Prefer rebuild from documented automation over manual reconstruction.
|
||||
- Validate restored services before returning them to use.
|
||||
- Record recovery actions in [BUILD-LOG.md](BUILD-LOG.md).
|
||||
|
||||
## OS Disk Failure
|
||||
|
||||
### Impact
|
||||
|
||||
- Ubuntu installation unavailable.
|
||||
- System packages and live configuration on the OS disk unavailable.
|
||||
- `/sql` and `/srv` may remain intact if their disks are healthy.
|
||||
|
||||
### Required Backups
|
||||
|
||||
- Ubuntu installation media.
|
||||
- Repository access through Gitea or another verified copy.
|
||||
- Copies of live system configuration not yet generated from this repository.
|
||||
- Secrets and SSH keys from an approved location outside this repository.
|
||||
|
||||
### Recovery Outline
|
||||
|
||||
1. Replace the OS disk if required.
|
||||
2. Reinstall Ubuntu 26.04 LTS.
|
||||
3. Restore hostname, network, SSH, and sudo access.
|
||||
4. Remount `/sql` and `/srv`.
|
||||
5. Clone or use the existing infrastructure repository.
|
||||
6. Run future installation automation when available.
|
||||
7. Restore live configuration and services.
|
||||
|
||||
### Validation
|
||||
|
||||
- Hostname is `atlas`.
|
||||
- Static IP address is `192.168.10.10`.
|
||||
- `/sql` and `/srv` are mounted.
|
||||
- Git can reach Gitea.
|
||||
- Required services start and pass smoke tests.
|
||||
|
||||
### Remaining Gaps
|
||||
|
||||
- OS rebuild automation is not yet implemented.
|
||||
- Live configuration inventory is not yet complete.
|
||||
|
||||
## SQL Disk Failure
|
||||
|
||||
### Impact
|
||||
|
||||
- SQL data on `/sql` may be unavailable or lost.
|
||||
- Applications depending on SQL Server may be unavailable.
|
||||
|
||||
### Required Backups
|
||||
|
||||
- Verified SQL backups from outside this repository.
|
||||
- SQL Server installation and configuration documentation.
|
||||
- SQL credentials from approved secret storage.
|
||||
|
||||
### Recovery Outline
|
||||
|
||||
1. Replace or repair the SQL disk.
|
||||
2. Recreate filesystem and mount at `/sql`.
|
||||
3. Reinstall or validate SQL Server.
|
||||
4. Restore databases from verified backups.
|
||||
5. Reapply permissions and maintenance jobs.
|
||||
|
||||
### Validation
|
||||
|
||||
- `/sql` is mounted.
|
||||
- SQL Server starts.
|
||||
- Databases are online.
|
||||
- Application connectivity succeeds.
|
||||
- Restore validation queries pass.
|
||||
|
||||
### Remaining Gaps
|
||||
|
||||
- SQL Server is not yet documented as installed by this repository.
|
||||
- Backup location, retention, and restore procedure are not yet confirmed.
|
||||
|
||||
## Development Disk Failure
|
||||
|
||||
### Impact
|
||||
|
||||
- `/srv` may be unavailable or lost.
|
||||
- Local repository working copies, scripts in progress, build artefacts, and deployment material on `/srv` may be lost.
|
||||
|
||||
### Required Backups
|
||||
|
||||
- Gitea remote repositories.
|
||||
- Any non-committed work that was backed up outside `/srv`.
|
||||
- Deployment artefacts only if they cannot be rebuilt from source.
|
||||
|
||||
### Recovery Outline
|
||||
|
||||
1. Replace or repair the development disk.
|
||||
2. Recreate filesystem and mount at `/srv`.
|
||||
3. Recreate `/srv/repos`.
|
||||
4. Clone required repositories from Gitea.
|
||||
5. Recreate build and deployment directories from documented automation.
|
||||
|
||||
### Validation
|
||||
|
||||
- `/srv` is mounted.
|
||||
- `/srv/repos` exists.
|
||||
- Infrastructure repository is cloned.
|
||||
- Required application repositories are cloned.
|
||||
- Smoke tests pass where available.
|
||||
|
||||
### Remaining Gaps
|
||||
|
||||
- Application repository inventory is not yet documented.
|
||||
- Build artefact and deployment location policy is not yet confirmed.
|
||||
|
||||
## Complete Server Loss
|
||||
|
||||
### Impact
|
||||
|
||||
- All local OS, SQL, development, configuration, and service state may be lost.
|
||||
- Recovery depends on external repositories, backups, installation media, and secret storage.
|
||||
|
||||
### Required Backups
|
||||
|
||||
- Gitea-hosted repositories or another off-server Git copy.
|
||||
- SQL backups.
|
||||
- Secret material from approved secret storage.
|
||||
- Configuration not yet represented in this repository.
|
||||
- Documentation needed to rebuild storage, network, and services.
|
||||
|
||||
### Recovery Outline
|
||||
|
||||
1. Replace or rebuild hardware.
|
||||
2. Install Ubuntu 26.04 LTS.
|
||||
3. Recreate storage layout with `/sql` and `/srv`.
|
||||
4. Restore network identity.
|
||||
5. Restore SSH and Gitea access.
|
||||
6. Clone this repository.
|
||||
7. Follow [REBUILD-GUIDE.md](REBUILD-GUIDE.md).
|
||||
8. Restore databases and services from verified backups.
|
||||
|
||||
### Validation
|
||||
|
||||
- Server identity matches documented values.
|
||||
- Repositories are restored.
|
||||
- Required services pass validation.
|
||||
- Applications pass smoke tests.
|
||||
- Data restore is verified.
|
||||
|
||||
### Remaining Gaps
|
||||
|
||||
- Full rebuild is not yet automated.
|
||||
- Off-server backup coverage has not been verified in this repository.
|
||||
|
||||
## Accidental Repository Deletion
|
||||
|
||||
### Impact
|
||||
|
||||
- Local infrastructure working copy under `/srv/repos/AI-Development-Server` is lost.
|
||||
- Uncommitted changes may be lost.
|
||||
|
||||
### Required Backups
|
||||
|
||||
- Gitea remote repository.
|
||||
- Any external backup containing uncommitted work, if available.
|
||||
|
||||
### Recovery Outline
|
||||
|
||||
1. Recreate `/srv/repos` if needed.
|
||||
2. Clone the repository from Gitea.
|
||||
3. Confirm branch and remote.
|
||||
4. Reapply any known uncommitted work only from trusted sources.
|
||||
|
||||
### Validation
|
||||
|
||||
- `git remote -v` shows the expected Gitea remote.
|
||||
- `git status` is clean or only shows expected work.
|
||||
- Required documentation and scripts are present.
|
||||
|
||||
### Remaining Gaps
|
||||
|
||||
- Uncommitted work recovery depends on external backups or manual reconstruction.
|
||||
|
||||
## Failed Application Deployment
|
||||
|
||||
### Impact
|
||||
|
||||
- A deployed application may be unavailable, partially updated, or running an unintended version.
|
||||
- Source repositories and this infrastructure repository should remain intact.
|
||||
|
||||
### Required Backups
|
||||
|
||||
- Previous known-good deployment artefact or source revision.
|
||||
- Database backup if the deployment includes schema or data changes.
|
||||
- Previous live configuration if changed.
|
||||
|
||||
### Recovery Outline
|
||||
|
||||
1. Stop or isolate the failed deployment if required.
|
||||
2. Restore the previous artefact or redeploy the previous source revision.
|
||||
3. Restore database state if required and approved.
|
||||
4. Restore previous configuration if changed.
|
||||
5. Validate application behaviour.
|
||||
|
||||
### Validation
|
||||
|
||||
- Service status is healthy.
|
||||
- nginx routing works if applicable.
|
||||
- Application smoke tests pass.
|
||||
- Logs show no repeated startup or request failures.
|
||||
|
||||
### Remaining Gaps
|
||||
|
||||
- Deployment paths, rollback scripts, and smoke tests are not yet defined.
|
||||
|
||||
## Configuration Corruption
|
||||
|
||||
### Impact
|
||||
|
||||
- Services may fail to start or may run with unintended settings.
|
||||
- Secret-bearing live configuration may need manual restoration.
|
||||
|
||||
### Required Backups
|
||||
|
||||
- Repository-managed templates.
|
||||
- Backup of live configuration files.
|
||||
- Secret values from approved secret storage.
|
||||
|
||||
### Recovery Outline
|
||||
|
||||
1. Identify the corrupted configuration.
|
||||
2. Compare live configuration with repository templates.
|
||||
3. Restore from a known-good backup or regenerate from templates.
|
||||
4. Reinsert secrets from approved storage without committing them.
|
||||
5. Validate and reload affected services.
|
||||
|
||||
### Validation
|
||||
|
||||
- Service configuration validation passes.
|
||||
- Service reload or restart succeeds.
|
||||
- Logs show expected behaviour.
|
||||
- Application smoke tests pass where available.
|
||||
|
||||
### Remaining Gaps
|
||||
|
||||
- Live configuration inventory and backup process are not yet complete.
|
||||
|
||||
## Credential Compromise
|
||||
|
||||
### Impact
|
||||
|
||||
- Unauthorised access may be possible to Atlas, Gitea, databases, deployments, external APIs, or backups.
|
||||
- Affected credentials must be rotated.
|
||||
|
||||
### Required Backups
|
||||
|
||||
- Not primarily a backup-driven recovery scenario.
|
||||
- Requires access to credential authorities and secret storage.
|
||||
|
||||
### Recovery Outline
|
||||
|
||||
1. Identify affected credentials and access scope.
|
||||
2. Revoke or rotate compromised credentials.
|
||||
3. Review logs for misuse.
|
||||
4. Update live systems with new credentials.
|
||||
5. Confirm no secret values were committed to Git.
|
||||
6. If a secret was committed, treat Git history and all clones as compromised for that secret.
|
||||
|
||||
### Validation
|
||||
|
||||
- Old credentials no longer work.
|
||||
- New credentials work only where intended.
|
||||
- Services using rotated credentials pass validation.
|
||||
- Repository search finds no committed live secret values.
|
||||
|
||||
### Remaining Gaps
|
||||
|
||||
- Credential inventory, rotation schedule, and incident process are not yet confirmed.
|
||||
140
docs/OPERATING-MODEL.md
Normal file
140
docs/OPERATING-MODEL.md
Normal file
@ -0,0 +1,140 @@
|
||||
# Operating Model
|
||||
|
||||
This document defines how Nick, ChatGPT, and Codex work together on Atlas.
|
||||
|
||||
## Roles
|
||||
|
||||
- Nick owns architecture approval, operational judgement, production access decisions, and commit approval.
|
||||
- ChatGPT supports planning, review, documentation, and implementation guidance.
|
||||
- Codex runs on Atlas to inspect the repository, make approved changes, run validation, and report diffs.
|
||||
|
||||
## Git as Source of Truth
|
||||
|
||||
Git is the source of truth for repository-managed infrastructure and operational intent.
|
||||
|
||||
- Infrastructure documentation belongs in this repository.
|
||||
- Installation scripts must be version-controlled.
|
||||
- Configuration templates must be version-controlled.
|
||||
- Manual changes should be recorded and converted to automation where practical.
|
||||
- Live secrets and generated artefacts must not be committed.
|
||||
|
||||
## Documentation-First Changes
|
||||
|
||||
Substantial changes should begin with documentation:
|
||||
|
||||
1. Define the problem or objective.
|
||||
2. Record relevant assumptions and unknowns.
|
||||
3. Update standards, architecture, runbooks, or ADRs as needed.
|
||||
4. Implement scripts or templates.
|
||||
5. Validate the result.
|
||||
6. Review the diff before commit.
|
||||
|
||||
## Codex Planning Before Implementation
|
||||
|
||||
Codex must inspect the repository and produce a plan before making architecture-level or broad repository changes.
|
||||
|
||||
Implementation should start only after Nick approves the plan, unless the request is a narrow mechanical change that clearly does not affect architecture or operations.
|
||||
|
||||
## Human Approval of Architecture
|
||||
|
||||
Architecture decisions require human approval. Use ADRs for decisions that affect:
|
||||
|
||||
- Infrastructure management approach.
|
||||
- Service topology.
|
||||
- Storage layout.
|
||||
- Deployment model.
|
||||
- Backup and recovery model.
|
||||
- Security boundaries.
|
||||
- Tooling choices with long-term maintenance impact.
|
||||
|
||||
## Commit Control
|
||||
|
||||
Codex must not commit unless explicitly instructed.
|
||||
|
||||
Before commit:
|
||||
|
||||
- Review `git status`.
|
||||
- Review the full relevant diff.
|
||||
- Run validation appropriate to the change.
|
||||
- Confirm no secrets are present.
|
||||
- Ensure documentation and implementation agree.
|
||||
|
||||
## Branching Expectations
|
||||
|
||||
Default branch:
|
||||
|
||||
- `main`
|
||||
|
||||
Branching model:
|
||||
|
||||
- `TODO: Confirm during the relevant implementation phase.`
|
||||
|
||||
Until a fuller branching model exists, keep work small, reviewable, and easy to revert.
|
||||
|
||||
## Diff Review
|
||||
|
||||
Every change should be reviewed with `git diff` before commit.
|
||||
|
||||
Review should check:
|
||||
|
||||
- Behavioural intent.
|
||||
- File paths.
|
||||
- Secrets exposure.
|
||||
- Inconsistent terminology.
|
||||
- Broken Markdown links.
|
||||
- Missing validation.
|
||||
- Unintended generated files.
|
||||
|
||||
## Testing Before Commit
|
||||
|
||||
Run the strongest practical validation before commit.
|
||||
|
||||
For documentation-only changes, validation should include:
|
||||
|
||||
- Repository tree inspection.
|
||||
- Markdown link checks where practical.
|
||||
- Search for accidental secrets.
|
||||
- Search for inconsistent server names, IP addresses, and mount paths.
|
||||
- `git diff --check`.
|
||||
|
||||
For scripts and service changes, validation should also include syntax checks, dry runs where available, and smoke tests.
|
||||
|
||||
## Rollback Expectations
|
||||
|
||||
- Prefer changes that can be reversed through Git and idempotent scripts.
|
||||
- Document rollback steps for service-affecting changes.
|
||||
- Preserve previous configuration where practical before replacing live files.
|
||||
- Remember that Git rollback does not automatically undo external system state.
|
||||
|
||||
## Handling of Secrets
|
||||
|
||||
- Do not commit secrets.
|
||||
- Do not print secrets in logs or command output.
|
||||
- Do not copy Codex authentication material into the repository.
|
||||
- Use templates, examples, and documented environment variable names.
|
||||
- Store live secrets outside this repository.
|
||||
- Rotate credentials after suspected exposure.
|
||||
|
||||
Secret storage mechanism is `TODO: Confirm during the relevant implementation phase.`
|
||||
|
||||
## Handling of Production Access
|
||||
|
||||
Production access must be deliberate and documented.
|
||||
|
||||
- Do not assume development and production permissions are the same.
|
||||
- Do not embed production credentials in scripts.
|
||||
- Do not run production-impacting commands without explicit approval.
|
||||
- Record deployment and rollback expectations before automating production changes.
|
||||
|
||||
Production access model is `TODO: Confirm during the relevant implementation phase.`
|
||||
|
||||
## Development and Production Responsibilities
|
||||
|
||||
Atlas is currently documented as a development server. Future production responsibilities must be explicitly approved before they are added.
|
||||
|
||||
Expected separation:
|
||||
|
||||
- Development: source work, automation development, local validation, builds, and staging-like testing.
|
||||
- Production: live application availability, production data protection, externally exposed endpoints, customer-impacting deployments, and incident response.
|
||||
|
||||
Whether Atlas will host production workloads is `TODO: Confirm during the relevant implementation phase.`
|
||||
165
docs/REBUILD-GUIDE.md
Normal file
165
docs/REBUILD-GUIDE.md
Normal file
@ -0,0 +1,165 @@
|
||||
# Rebuild Guide
|
||||
|
||||
This guide describes the planned rebuild path for Atlas. At Phase 1, the repository contains documentation but no executable installation phases. Steps marked as TODO are not yet automated.
|
||||
|
||||
## Automation Status
|
||||
|
||||
- Repository structure and documentation: present.
|
||||
- Installation scripts: not yet created.
|
||||
- Configuration templates: not yet created.
|
||||
- Operational scripts: not yet created.
|
||||
- Smoke tests: not yet created.
|
||||
- Backup and restore automation: not yet created.
|
||||
|
||||
## Preconditions
|
||||
|
||||
- Physical server hardware is available.
|
||||
- Ubuntu 26.04 LTS installation media is available.
|
||||
- Network details for Atlas are known.
|
||||
- Gitea SSH access can be restored or re-created.
|
||||
- Required secrets and private keys are available from an approved location outside this repository.
|
||||
- Backups are available where required.
|
||||
|
||||
Backup inventory and credential recovery process are `TODO: Confirm during the relevant implementation phase.`
|
||||
|
||||
## 1. Ubuntu Installation
|
||||
|
||||
1. Install Ubuntu 26.04 LTS on the OS SSD.
|
||||
2. Set hostname to `atlas`.
|
||||
3. Create the dedicated development user.
|
||||
4. Configure administrative access for the development user.
|
||||
5. Apply operating system updates.
|
||||
|
||||
Exact installer choices, partitioning profile, and user creation procedure are `TODO: Confirm during the relevant implementation phase.`
|
||||
|
||||
## 2. Storage Preparation
|
||||
|
||||
Target storage layout:
|
||||
|
||||
- OS volume mounted at `/`
|
||||
- SQL data volume mounted at `/sql`
|
||||
- Development volume mounted at `/srv`
|
||||
- Repository root at `/srv/repos`
|
||||
|
||||
Current Phase 1 status:
|
||||
|
||||
- `/sql` is the intended SQL data volume.
|
||||
- `/srv` is the primary development volume.
|
||||
- Idempotent storage preparation scripts do not exist yet.
|
||||
|
||||
Future rebuild work must document:
|
||||
|
||||
- Disk identification method.
|
||||
- Filesystem labels or UUIDs.
|
||||
- `/etc/fstab` entries.
|
||||
- Mount validation commands.
|
||||
- Ownership and permissions.
|
||||
|
||||
These details are `TODO: Confirm during the relevant implementation phase.`
|
||||
|
||||
## 3. Network Setup
|
||||
|
||||
Target identity:
|
||||
|
||||
- Hostname: `atlas`
|
||||
- Static IP address: `192.168.10.10`
|
||||
- Default gateway: `192.168.10.1`
|
||||
- Primary interface: `enp3s0`
|
||||
|
||||
Configure DNS, host mappings, firewall rules, and public exposure only after the relevant policy is confirmed.
|
||||
|
||||
DNS and firewall details are `TODO: Confirm during the relevant implementation phase.`
|
||||
|
||||
## 4. SSH
|
||||
|
||||
1. Install or enable OpenSSH.
|
||||
2. Confirm SSH access from trusted administration clients.
|
||||
3. Restore or create the SSH key needed for Gitea access.
|
||||
4. Keep private keys outside this repository.
|
||||
|
||||
SSH hardening policy, trusted client list, and key rotation procedure are `TODO: Confirm during the relevant implementation phase.`
|
||||
|
||||
## 5. Repository Checkout
|
||||
|
||||
Create the repository root if needed:
|
||||
|
||||
```bash
|
||||
sudo mkdir -p /srv/repos
|
||||
```
|
||||
|
||||
Clone the infrastructure repository:
|
||||
|
||||
```bash
|
||||
cd /srv/repos
|
||||
git clone git@git.catherinelynwood.com:atlas-bot/AI-Development-Server.git
|
||||
cd AI-Development-Server
|
||||
```
|
||||
|
||||
If the remote repository is unavailable, follow the disaster recovery guidance in [DISASTER-RECOVERY.md](DISASTER-RECOVERY.md).
|
||||
|
||||
## 6. Bootstrap Process
|
||||
|
||||
At Phase 1, bootstrap is manual. Future bootstrap should be reduced to a documented command sequence that runs idempotent scripts from this repository.
|
||||
|
||||
Planned bootstrap flow:
|
||||
|
||||
1. Review [README.md](../README.md).
|
||||
2. Review [SERVER-STANDARDS.md](../SERVER-STANDARDS.md).
|
||||
3. Review this rebuild guide.
|
||||
4. Run base installation validation.
|
||||
5. Run ordered installation scripts from `install/` when they exist.
|
||||
6. Run smoke tests from `tests/` when they exist.
|
||||
|
||||
Bootstrap command sequence is `TODO: Confirm during the relevant implementation phase.`
|
||||
|
||||
## 7. Running Installation Phases
|
||||
|
||||
Planned scripts may include:
|
||||
|
||||
```text
|
||||
install/01-base-tools.sh
|
||||
install/02-dotnet.sh
|
||||
install/03-sqlserver.sh
|
||||
install/04-nginx.sh
|
||||
install/05-docker.sh
|
||||
```
|
||||
|
||||
These scripts do not exist yet. When created, each script must:
|
||||
|
||||
- Be idempotent.
|
||||
- Validate prerequisites.
|
||||
- Log concise progress.
|
||||
- Avoid printing secrets.
|
||||
- Document rollback expectations.
|
||||
- Include or reference validation steps.
|
||||
|
||||
## 8. Validation
|
||||
|
||||
Minimum rebuild validation should confirm:
|
||||
|
||||
- Hostname is `atlas`.
|
||||
- Static IP address is `192.168.10.10`.
|
||||
- `/sql` is mounted.
|
||||
- `/srv` is mounted.
|
||||
- `/srv/repos` exists.
|
||||
- Git can reach Gitea over SSH.
|
||||
- This repository is checked out.
|
||||
- Required installation phases have run successfully.
|
||||
- Smoke tests pass.
|
||||
|
||||
Validation scripts are `TODO: Confirm during the relevant implementation phase.`
|
||||
|
||||
## 9. Restoring Services and Data
|
||||
|
||||
Restoration order should be:
|
||||
|
||||
1. Restore base OS access.
|
||||
2. Restore storage mounts.
|
||||
3. Restore repository access.
|
||||
4. Run installation automation.
|
||||
5. Restore configuration generated from templates.
|
||||
6. Restore SQL data from verified backups.
|
||||
7. Restore deployed applications or rebuild them from source.
|
||||
8. Validate services and application behaviour.
|
||||
|
||||
SQL backup location, deployment artefact policy, restore commands, and service validation are `TODO: Confirm during the relevant implementation phase.`
|
||||
33
docs/adr/0001-infrastructure-as-code.md
Normal file
33
docs/adr/0001-infrastructure-as-code.md
Normal file
@ -0,0 +1,33 @@
|
||||
# 0001: Infrastructure as Code
|
||||
|
||||
## Status
|
||||
|
||||
Accepted
|
||||
|
||||
## Context
|
||||
|
||||
Atlas is a dedicated AI development server intended to be rebuildable from a clean Ubuntu installation. The server needs a practical source of truth for architecture, standards, installation automation, configuration templates, operational scripts, tests, recovery procedures, architectural decisions, and build history.
|
||||
|
||||
Manual server changes are difficult to audit and repeat. A repository-managed approach gives Atlas a reviewable history and creates a path toward reliable rebuilds.
|
||||
|
||||
## Decision
|
||||
|
||||
Atlas will be managed using Infrastructure as Code principles.
|
||||
|
||||
This repository is the authoritative source for Atlas infrastructure and operations. Installation and operational automation will be implemented as documented, version-controlled, idempotent scripts. Configuration will be represented through repository-managed templates where practical. Unknown details will remain documented as TODOs until the relevant implementation phase confirms them.
|
||||
|
||||
## Consequences
|
||||
|
||||
- Infrastructure changes must be reviewable in Git.
|
||||
- Manual changes should be documented and converted into automation where practical.
|
||||
- Scripts must be safe to rerun.
|
||||
- Documentation is part of the operational system and must be maintained.
|
||||
- Secrets must remain outside the repository.
|
||||
- Rebuild and recovery should become more reliable as automation is added.
|
||||
- Initial progress may be slower because standards and documentation are created before automation.
|
||||
|
||||
## Alternatives considered
|
||||
|
||||
- Continue managing the server manually. This was rejected because it would make rebuilds, audits, and recovery harder.
|
||||
- Use ad hoc scripts outside Git. This was rejected because it would not provide reliable history or review.
|
||||
- Adopt a heavier configuration-management system immediately. This was deferred because Atlas is currently a single server and Bash scripts are sufficient for the initial phase.
|
||||
40
docs/adr/README.md
Normal file
40
docs/adr/README.md
Normal file
@ -0,0 +1,40 @@
|
||||
# Architecture Decision Records
|
||||
|
||||
Architecture Decision Records capture decisions that affect the long-term structure, operation, security, or rebuildability of Atlas.
|
||||
|
||||
## When to Create an ADR
|
||||
|
||||
Create an ADR for decisions about:
|
||||
|
||||
- Infrastructure management approach.
|
||||
- Service topology.
|
||||
- Storage layout.
|
||||
- Deployment model.
|
||||
- Backup and recovery model.
|
||||
- Security and trust boundaries.
|
||||
- Tooling choices with long-term maintenance impact.
|
||||
|
||||
Small implementation details do not need ADRs unless they establish a precedent.
|
||||
|
||||
## Naming Convention
|
||||
|
||||
Use a four-digit sequence number and a short lower-case slug:
|
||||
|
||||
```text
|
||||
0001-infrastructure-as-code.md
|
||||
0002-example-decision.md
|
||||
```
|
||||
|
||||
Do not renumber existing ADRs.
|
||||
|
||||
## Required Sections
|
||||
|
||||
Each ADR should include:
|
||||
|
||||
- Status
|
||||
- Context
|
||||
- Decision
|
||||
- Consequences
|
||||
- Alternatives considered
|
||||
|
||||
Accepted ADRs remain part of the historical record. If a decision changes, create a new ADR that supersedes the earlier one.
|
||||
48
install/README.md
Normal file
48
install/README.md
Normal file
@ -0,0 +1,48 @@
|
||||
# Install
|
||||
|
||||
This directory is reserved for ordered, idempotent installation scripts for Atlas.
|
||||
|
||||
## What Belongs Here
|
||||
|
||||
- Bootstrap scripts.
|
||||
- Package installation scripts.
|
||||
- Service installation scripts.
|
||||
- Storage, runtime, and tooling setup scripts.
|
||||
- Validation wrappers for installation phases.
|
||||
|
||||
## What Must Not Be Stored Here
|
||||
|
||||
- Secrets, passwords, tokens, private keys, or live credentials.
|
||||
- One-off experiments.
|
||||
- Generated logs.
|
||||
- Downloaded package caches.
|
||||
- Application source code.
|
||||
- Deployment artefacts.
|
||||
|
||||
## Naming Conventions
|
||||
|
||||
Use a two-digit numeric prefix followed by a short lower-case hyphenated name:
|
||||
|
||||
```text
|
||||
01-base-tools.sh
|
||||
02-dotnet.sh
|
||||
03-sqlserver.sh
|
||||
04-nginx.sh
|
||||
05-docker.sh
|
||||
```
|
||||
|
||||
Scripts must follow [SERVER-STANDARDS.md](../SERVER-STANDARDS.md).
|
||||
|
||||
## Expected Future Structure
|
||||
|
||||
Phase scripts may be added directly under this directory at first. If the directory grows, shared helpers may be added under a clearly named subdirectory.
|
||||
|
||||
Future structure is `TODO: Confirm during the relevant implementation phase.`
|
||||
|
||||
## Security Considerations
|
||||
|
||||
- Use `sudo` only for commands that need it.
|
||||
- Do not print secrets.
|
||||
- Do not embed credentials.
|
||||
- Validate package sources and signing keys.
|
||||
- Make scripts safe to rerun.
|
||||
49
scripts/README.md
Normal file
49
scripts/README.md
Normal file
@ -0,0 +1,49 @@
|
||||
# Scripts
|
||||
|
||||
This directory is for operational scripts used after Atlas is installed.
|
||||
|
||||
## What Belongs Here
|
||||
|
||||
- Backup scripts.
|
||||
- Restore scripts.
|
||||
- Deployment scripts.
|
||||
- Maintenance scripts.
|
||||
- Monitoring scripts.
|
||||
- Service validation helpers.
|
||||
|
||||
## What Must Not Be Stored Here
|
||||
|
||||
- Installation phase scripts. Those belong in `install/`.
|
||||
- Secrets or credentials.
|
||||
- Generated logs.
|
||||
- Temporary files.
|
||||
- Build artefacts.
|
||||
- One-off experimental commands.
|
||||
|
||||
## Naming Conventions
|
||||
|
||||
- Use lower-case hyphenated names.
|
||||
- Prefer verb-target names, such as `backup-sql.sh` or `check-disk-space.sh`.
|
||||
- Group scripts by operational area when useful.
|
||||
- Executable permissions should be used only for scripts intended to run directly.
|
||||
|
||||
## Expected Future Structure
|
||||
|
||||
Current planned areas include:
|
||||
|
||||
```text
|
||||
scripts/backup/
|
||||
scripts/deploy/
|
||||
scripts/maintenance/
|
||||
scripts/monitoring/
|
||||
scripts/restore/
|
||||
```
|
||||
|
||||
Additional areas may be added when a repeated operational need exists.
|
||||
|
||||
## Security Considerations
|
||||
|
||||
- Do not print secrets.
|
||||
- Do not store credentials in scripts.
|
||||
- Make destructive actions explicit and documented.
|
||||
- Include validation and rollback guidance for service-affecting scripts.
|
||||
1
scripts/backup/.gitkeep
Normal file
1
scripts/backup/.gitkeep
Normal file
@ -0,0 +1 @@
|
||||
|
||||
1
scripts/deploy/.gitkeep
Normal file
1
scripts/deploy/.gitkeep
Normal file
@ -0,0 +1 @@
|
||||
|
||||
1
scripts/maintenance/.gitkeep
Normal file
1
scripts/maintenance/.gitkeep
Normal file
@ -0,0 +1 @@
|
||||
|
||||
1
scripts/monitoring/.gitkeep
Normal file
1
scripts/monitoring/.gitkeep
Normal file
@ -0,0 +1 @@
|
||||
|
||||
1
scripts/restore/.gitkeep
Normal file
1
scripts/restore/.gitkeep
Normal file
@ -0,0 +1 @@
|
||||
|
||||
36
templates/README.md
Normal file
36
templates/README.md
Normal file
@ -0,0 +1,36 @@
|
||||
# Templates
|
||||
|
||||
This directory is for reusable templates that do not belong to one specific service directory under `config/`.
|
||||
|
||||
## What Belongs Here
|
||||
|
||||
- Generic environment file examples.
|
||||
- Reusable script templates.
|
||||
- Documentation templates.
|
||||
- Deployment manifest examples.
|
||||
- Non-secret placeholder files.
|
||||
|
||||
## What Must Not Be Stored Here
|
||||
|
||||
- Live `.env` files.
|
||||
- Passwords, tokens, private keys, or certificates.
|
||||
- Generated credentials.
|
||||
- Live service configuration.
|
||||
- Build artefacts.
|
||||
- Backups.
|
||||
|
||||
## Naming Conventions
|
||||
|
||||
- Use lower-case hyphenated names.
|
||||
- Use `.template`, `.example`, or `.sample` suffixes where appropriate.
|
||||
- Use obvious placeholder values such as `CHANGE_ME` or `${ENV_VAR_NAME}`.
|
||||
|
||||
## Expected Future Structure
|
||||
|
||||
Subdirectories may be introduced when templates grow beyond a small number of files.
|
||||
|
||||
Future structure is `TODO: Confirm during the relevant implementation phase.`
|
||||
|
||||
## Security Considerations
|
||||
|
||||
Templates are version-controlled and must be safe to publish to anyone with repository access. Never include a live credential, even temporarily.
|
||||
39
tests/README.md
Normal file
39
tests/README.md
Normal file
@ -0,0 +1,39 @@
|
||||
# Tests
|
||||
|
||||
This directory is for smoke tests and validation checks for Atlas infrastructure.
|
||||
|
||||
## What Belongs Here
|
||||
|
||||
- Smoke tests for installation phases.
|
||||
- Validation checks for mounts, services, network identity, and repository state.
|
||||
- Script syntax checks.
|
||||
- Non-secret test fixtures.
|
||||
|
||||
## What Must Not Be Stored Here
|
||||
|
||||
- Secrets.
|
||||
- Real production data.
|
||||
- SQL backups.
|
||||
- Large generated test output.
|
||||
- Package caches.
|
||||
- Environment-specific local overrides.
|
||||
|
||||
## Naming Conventions
|
||||
|
||||
- Use lower-case hyphenated names.
|
||||
- Prefer names that describe the observable behaviour being checked.
|
||||
- Group tests by area when useful, for example `tests/smoke/`.
|
||||
|
||||
## Expected Future Structure
|
||||
|
||||
Current planned areas include:
|
||||
|
||||
```text
|
||||
tests/smoke/
|
||||
```
|
||||
|
||||
Additional test groups should be added only when they have clear ownership and purpose.
|
||||
|
||||
## Security Considerations
|
||||
|
||||
Tests must not expose secrets or mutate production data unless explicitly designed and approved. Prefer read-only validation where practical.
|
||||
1
tests/smoke/.gitkeep
Normal file
1
tests/smoke/.gitkeep
Normal file
@ -0,0 +1 @@
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user