initial runbook
This commit is contained in:
40
Admin_Guide.md
Normal file
40
Admin_Guide.md
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
# Admin Guide
|
||||||
|
|
||||||
|
## Gaussian Wellworks
|
||||||
|
|
||||||
|
### 1. Admin Guide Objective
|
||||||
|
|
||||||
|
### 2. Implementation Detail
|
||||||
|
|
||||||
|
*Note: Numbers below match the task numbers in the Runbook not the paragraph organization of this document.*
|
||||||
|
|
||||||
|
#### 3.1 Create Digital Ocean Account
|
||||||
|
|
||||||
|
**Droplet Detail**
|
||||||
|
|
||||||
|
- Public IP: 107.170.17.43
|
||||||
|
- Hostname: gw-drive-01
|
||||||
|
- Region: NYC2
|
||||||
|
- OS: Ubuntu 24.04 (LTS)
|
||||||
|
- Spec: 2 Intel vCPU / 8GB / 160GB
|
||||||
|
- Backups: Weekly Wednesday 4:00am - 8:00am UTC
|
||||||
|
|
||||||
|
|
||||||
|
## SSH
|
||||||
|
Secure Passcode: L0neSt@r
|
||||||
|
|
||||||
|
## DROPLET
|
||||||
|
Public IP: 107.170.17.43
|
||||||
|
Hostname: gw-drive-01
|
||||||
|
|
||||||
|
|
||||||
|
## NEXTCLOUD
|
||||||
|
|
||||||
|
.env File
|
||||||
|
MYSQL_ROOT_PASSWORD=K9frlsUdr+rL
|
||||||
|
MYSQL_PASSWORD=6aK#yU&O-A2H
|
||||||
|
MYSQL_DATABASE=nextcloud
|
||||||
|
MYSQL_USER=nextcloud
|
||||||
|
|
||||||
|
NEXTCLOUD_ADMIN_USER=admin
|
||||||
|
NEXTCLOUD_ADMIN_PASSWORD=DesI$8w9ad_4
|
||||||
800
Runbook.md
Normal file
800
Runbook.md
Normal file
@@ -0,0 +1,800 @@
|
|||||||
|
# Runbook: Self-hosted Pilot
|
||||||
|
|
||||||
|
## Gaussian Wellworks
|
||||||
|
|
||||||
|
## 1. Runbook Objective
|
||||||
|
|
||||||
|
## 2. Critical Dependencies
|
||||||
|
|
||||||
|
### 2.1 Business Domain Ownership
|
||||||
|
### 2.2 Administrative Access
|
||||||
|
### 2.3 Decision Checklist
|
||||||
|
|
||||||
|
## 3. Detailed Runbook
|
||||||
|
|
||||||
|
### 3.1 Create Digital Ocean Account
|
||||||
|
|
||||||
|
### 3.2 Create SSH Key Pair (Windows 11)
|
||||||
|
|
||||||
|
**Generate key**
|
||||||
|
```Powershell
|
||||||
|
</> Powershell
|
||||||
|
|
||||||
|
ssh-keygen -t ed25519 -C "admin@company.com"
|
||||||
|
```
|
||||||
|
|
||||||
|
Accept default path:
|
||||||
|
```
|
||||||
|
C:\Users\<user>\.ssh\id_ed25519
|
||||||
|
```
|
||||||
|
|
||||||
|
**Copy public key**
|
||||||
|
```Powershell
|
||||||
|
</> Powershell
|
||||||
|
|
||||||
|
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub | Set-Clipboard
|
||||||
|
```
|
||||||
|
|
||||||
|
**Upload to DigitalOcean**
|
||||||
|
|
||||||
|
- Settings → Security → SSH Keys → Add
|
||||||
|
- Name: admin-windows11
|
||||||
|
|
||||||
|
**Validation**
|
||||||
|
|
||||||
|
[✔] Key visible in DigitalOcean
|
||||||
|
|
||||||
|
|
||||||
|
### 3.3 Provision Droplet
|
||||||
|
|
||||||
|
**Configuration**
|
||||||
|
```
|
||||||
|
Image: Ubuntu 22.04 LTS
|
||||||
|
Plan: Premium Intel
|
||||||
|
Size: 4 vCPU / 8GB RAM
|
||||||
|
Region: closest to users
|
||||||
|
Auth: SSH key
|
||||||
|
Backups: Enabled
|
||||||
|
Hostname: gw-drive-01
|
||||||
|
```
|
||||||
|
|
||||||
|
**Test SSH**
|
||||||
|
```Powershell
|
||||||
|
ssh root@<IP>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Validation**
|
||||||
|
|
||||||
|
[✔] SSH login works
|
||||||
|
[✔] IP recorded
|
||||||
|
|
||||||
|
### 3.4 Initial Server Configuration
|
||||||
|
|
||||||
|
**Create admin user**
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
</> Bash
|
||||||
|
|
||||||
|
adduser adminuser
|
||||||
|
usermod -aG sudo adminuser
|
||||||
|
```
|
||||||
|
|
||||||
|
**Copy SSH key**
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
</> Bash
|
||||||
|
|
||||||
|
rsync --archive --chown=adminuser:adminuser ~/.ssh /home/adminuser
|
||||||
|
```
|
||||||
|
|
||||||
|
**Disable root login**
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
</> Bash
|
||||||
|
|
||||||
|
sudo tee /etc/ssh/sshd_config > /dev/null << 'EOF'
|
||||||
|
PermitRootLogin no
|
||||||
|
PasswordAuthentication no
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
</> Bash
|
||||||
|
|
||||||
|
sudo systemctl restart ssh
|
||||||
|
```
|
||||||
|
|
||||||
|
**Test login**
|
||||||
|
|
||||||
|
```Powershell
|
||||||
|
</> Powershell
|
||||||
|
|
||||||
|
ssh adminuser@<IP>
|
||||||
|
```
|
||||||
|
|
||||||
|
**Update system**
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
</> Bash
|
||||||
|
|
||||||
|
sudo apt update
|
||||||
|
sudo apt upgrade -y
|
||||||
|
sudo apt autoremove -y
|
||||||
|
```
|
||||||
|
|
||||||
|
**Validation**
|
||||||
|
[✔] adminuser login works
|
||||||
|
[✔] root login blocked
|
||||||
|
[✔] system updated
|
||||||
|
|
||||||
|
### 3.5 Configure Firewall
|
||||||
|
|
||||||
|
**DigitalOcean Firewall**
|
||||||
|
|
||||||
|
Allow:
|
||||||
|
```
|
||||||
|
22 (SSH) → your IP
|
||||||
|
80 (HTTP) → all
|
||||||
|
443 (HTTPS) → all
|
||||||
|
```
|
||||||
|
|
||||||
|
Attach to droplet.
|
||||||
|
|
||||||
|
**UFW**
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
</> Bash
|
||||||
|
|
||||||
|
sudo apt install ufw -y
|
||||||
|
sudo ufw default deny incoming
|
||||||
|
sudo ufw default allow outgoing
|
||||||
|
|
||||||
|
sudo ufw allow 22/tcp
|
||||||
|
sudo ufw allow 80/tcp
|
||||||
|
sudo ufw allow 443/tcp
|
||||||
|
|
||||||
|
sudo ufw enable
|
||||||
|
```
|
||||||
|
|
||||||
|
**Validation**
|
||||||
|
```Bash
|
||||||
|
</> Bash
|
||||||
|
|
||||||
|
sudo ufw status
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.6 Configure DNS
|
||||||
|
|
||||||
|
**Create A record**
|
||||||
|
```
|
||||||
|
Host: drive
|
||||||
|
Value: <DROPLET_IP>
|
||||||
|
TTL: 300
|
||||||
|
```
|
||||||
|
|
||||||
|
**Validate**
|
||||||
|
```Powershell
|
||||||
|
</> Powershell
|
||||||
|
|
||||||
|
nslookup drive.company.com
|
||||||
|
```
|
||||||
|
|
||||||
|
*Note*
|
||||||
|
⚠ DNS propagation required before SSL
|
||||||
|
|
||||||
|
|
||||||
|
### 3.7 Install Docker
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
</> Bash
|
||||||
|
sudo apt install ca-certificates curl gnupg -y
|
||||||
|
sudo mkdir -p /etc/apt/keyrings
|
||||||
|
|
||||||
|
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
|
||||||
|
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
|
||||||
|
```
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
</> Bash
|
||||||
|
echo \
|
||||||
|
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
|
||||||
|
https://download.docker.com/linux/ubuntu \
|
||||||
|
$(lsb_release -cs) stable" | \
|
||||||
|
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
|
||||||
|
```
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
</> Bash
|
||||||
|
sudo apt update
|
||||||
|
sudo apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin -y
|
||||||
|
```
|
||||||
|
|
||||||
|
**Enable Docker**
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
</> Bash
|
||||||
|
sudo systemctl enable docker
|
||||||
|
sudo systemctl start docker
|
||||||
|
sudo usermod -aG docker adminuser
|
||||||
|
```
|
||||||
|
|
||||||
|
Reconnect SSH.
|
||||||
|
|
||||||
|
**Test**
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
</> Bash
|
||||||
|
|
||||||
|
docker run hello-world
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.10 Deploy Nextcloud
|
||||||
|
|
||||||
|
**Create directory**
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
</> Bash
|
||||||
|
|
||||||
|
mkdir -p ~/apps/nextcloud
|
||||||
|
cd ~/apps/nextcloud
|
||||||
|
```
|
||||||
|
|
||||||
|
**Create .env**
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
</> Bash
|
||||||
|
sudo tee .env > /dev/null << 'EOF'
|
||||||
|
MYSQL_ROOT_PASSWORD=StrongRootPassword
|
||||||
|
MYSQL_PASSWORD=StrongDBPassword
|
||||||
|
MYSQL_DATABASE=nextcloud
|
||||||
|
MYSQL_USER=nextcloud
|
||||||
|
|
||||||
|
NEXTCLOUD_ADMIN_USER=admin
|
||||||
|
NEXTCLOUD_ADMIN_PASSWORD=StrongAdminPassword
|
||||||
|
|
||||||
|
MYSQL_HOST=db
|
||||||
|
REDIS_HOST=redis
|
||||||
|
NEXTCLOUD_TRUSTED_DOMAINS=<IP>
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
**Create docker-compose**
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
</> Bash
|
||||||
|
sudo tee docker-compose.yml > /dev/null << 'EOF'
|
||||||
|
version: '3.9'
|
||||||
|
|
||||||
|
services:
|
||||||
|
db:
|
||||||
|
image: mariadb:10.6
|
||||||
|
restart: always
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
volumes:
|
||||||
|
- db_data:/var/lib/mysql
|
||||||
|
|
||||||
|
redis:
|
||||||
|
image: redis:7-alpine
|
||||||
|
restart: always
|
||||||
|
|
||||||
|
app:
|
||||||
|
image: nextcloud:apache
|
||||||
|
restart: always
|
||||||
|
ports:
|
||||||
|
- "8080:80"
|
||||||
|
env_file:
|
||||||
|
- .env
|
||||||
|
depends_on:
|
||||||
|
- db
|
||||||
|
- redis
|
||||||
|
volumes:
|
||||||
|
- nextcloud_data:/var/www/html
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
db_data:
|
||||||
|
nextcloud_data:
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
**Start**
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
</> Bash
|
||||||
|
|
||||||
|
docker compose up -d
|
||||||
|
```
|
||||||
|
|
||||||
|
**Validate**
|
||||||
|
```
|
||||||
|
http://<IP>:8080
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.11 Validate Internal Access
|
||||||
|
|
||||||
|
**Test:**
|
||||||
|
|
||||||
|
- [ ] Login
|
||||||
|
- [ ] Upload file
|
||||||
|
- [ ] Create folder
|
||||||
|
- [ ] Restart containers
|
||||||
|
- [ ] Data persists
|
||||||
|
|
||||||
|
### 3.12 Install Nginx
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
</> Bash
|
||||||
|
sudo apt install nginx -y
|
||||||
|
sudo systemctl enable nginx
|
||||||
|
sudo systemctl start nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
**Test:**
|
||||||
|
```
|
||||||
|
http://<IP> → nginx welcome page
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3.13 Configure HTTP Reverse Proxy (Staging Only)
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
</> Bash
|
||||||
|
|
||||||
|
sudo tee /etc/nginx/sites-available/nextcloud > /dev/null << 'EOF'
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name drive.company.com;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://127.0.0.1:8080;
|
||||||
|
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto http;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
**Enable:**
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
</> Bash
|
||||||
|
|
||||||
|
sudo ln -s /etc/nginx/sites-available/nextcloud /etc/nginx/sites-enabled/
|
||||||
|
sudo nginx -t
|
||||||
|
sudo systemctl reload nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
*Important*
|
||||||
|
- ⚠ This step is NOT fully usable yet
|
||||||
|
- ⚠ HTTPS may redirect and show 404 (expected)
|
||||||
|
|
||||||
|
### 3.14 Install SSL (Certbot)
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
</> Bash
|
||||||
|
|
||||||
|
sudo apt install certbot python3-certbot-nginx -y
|
||||||
|
sudo certbot --nginx -d drive.company.com
|
||||||
|
```
|
||||||
|
|
||||||
|
**Validate**
|
||||||
|
- ✔ Certificate issued
|
||||||
|
- ✔ HTTPS reachable
|
||||||
|
- ⚠ May still show 404 (expected)
|
||||||
|
|
||||||
|
### 3.15 Finalize HTTPS Reverse Proxy
|
||||||
|
|
||||||
|
**Replace config**
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
</> Bash
|
||||||
|
|
||||||
|
sudo tee /etc/nginx/sites-available/nextcloud > /dev/null << 'EOF'
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
server_name drive.company.com;
|
||||||
|
|
||||||
|
return 301 https://$host$request_uri;
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 443 ssl http2;
|
||||||
|
server_name drive.company.com;
|
||||||
|
|
||||||
|
ssl_certificate /etc/letsencrypt/live/drive.company.com/fullchain.pem;
|
||||||
|
ssl_certificate_key /etc/letsencrypt/live/drive.company.com/privkey.pem;
|
||||||
|
|
||||||
|
client_max_body_size 10G;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://127.0.0.1:8080;
|
||||||
|
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto https;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
```
|
||||||
|
|
||||||
|
**Reload**
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
</> Bash
|
||||||
|
|
||||||
|
sudo nginx -t
|
||||||
|
sudo systemctl reload nginx
|
||||||
|
```
|
||||||
|
|
||||||
|
**Fix Nextcloud**
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
</> Bash
|
||||||
|
|
||||||
|
docker exec -u www-data nextcloud-app php occ config:system:set trusted_domains 1 --value="drive.company.com"
|
||||||
|
docker exec -u www-data nextcloud-app php occ config:system:set overwrite.cli.url --value="https://drive.company.com"
|
||||||
|
docker exec -u www-data nextcloud-app php occ config:system:set overwriteprotocol --value="https"
|
||||||
|
```
|
||||||
|
|
||||||
|
**Final Validation**
|
||||||
|
|
||||||
|
https://drive.company.com
|
||||||
|
|
||||||
|
- ✔ Login works
|
||||||
|
- ✔ Upload works
|
||||||
|
- ✔ Download works
|
||||||
|
- ✔ No warnings
|
||||||
|
- ✔ HTTPS padlock present
|
||||||
|
|
||||||
|
**Cleanup**
|
||||||
|
|
||||||
|
```Bash
|
||||||
|
</> Bash
|
||||||
|
|
||||||
|
sudo ufw delete allow 8080/tcp
|
||||||
|
```
|
||||||
|
|
||||||
|
✅ Final Outcome
|
||||||
|
- ✔ Secure Nextcloud deployment
|
||||||
|
- ✔ HTTPS reverse proxy functional
|
||||||
|
- ✔ Docker-based architecture
|
||||||
|
- ✔ Ready for users and workflows
|
||||||
|
|
||||||
|
### 3.16 Create Email Provider Account (Fastmail)
|
||||||
|
|
||||||
|
**Objective**
|
||||||
|
|
||||||
|
Establish a business-grade email platform using Fastmail so that:
|
||||||
|
|
||||||
|
- domain-based email (user@company.com)
|
||||||
|
- reliable outbound mail (for Nextcloud notifications later)
|
||||||
|
- foundation for SPF/DKIM/DMARC
|
||||||
|
|
||||||
|
**Architectural Context**
|
||||||
|
|
||||||
|
Email is not hosted on your droplet. Your infrastructure will later integrate with it for:
|
||||||
|
|
||||||
|
- Nextcloud notifications
|
||||||
|
- User accounts
|
||||||
|
- Client communication
|
||||||
|
|
||||||
|
**Prerequisites**
|
||||||
|
- Domain ownership confirmed
|
||||||
|
- Access to DNS registrar
|
||||||
|
- Decision: Fastmail selected (per runbook)
|
||||||
|
|
||||||
|
**Step 1 - Create Fastmail Account**
|
||||||
|
|
||||||
|
Go to: https://www.fastmail.com
|
||||||
|
|
||||||
|
1.1 Sign up
|
||||||
|
- Click Sign Up
|
||||||
|
- Choose a plan (Standard is sufficient for pilot)
|
||||||
|
- Enter:
|
||||||
|
```
|
||||||
|
Name
|
||||||
|
Email (temporary Fastmail domain)
|
||||||
|
Password
|
||||||
|
```
|
||||||
|
|
||||||
|
1.2 Complete account creation
|
||||||
|
|
||||||
|
You will land in the Fastmail admin interface.
|
||||||
|
|
||||||
|
**Step 2 - Add Your Domain**
|
||||||
|
|
||||||
|
2.1 Navigate to Domains
|
||||||
|
|
||||||
|
In Fastmail:
|
||||||
|
```
|
||||||
|
Settings → Domains → Add Domain
|
||||||
|
```
|
||||||
|
|
||||||
|
2.2 Enter your domain
|
||||||
|
```
|
||||||
|
company.com
|
||||||
|
```
|
||||||
|
Click:
|
||||||
|
```
|
||||||
|
Add Domain
|
||||||
|
```
|
||||||
|
|
||||||
|
**Step 3 - Verify Domain Ownership**
|
||||||
|
|
||||||
|
Fastmail will present a TXT verification record.
|
||||||
|
|
||||||
|
3.1 Copy TXT record
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```
|
||||||
|
Type: TXT
|
||||||
|
Name: @
|
||||||
|
Value: fm-domain-verification=abc123xyz
|
||||||
|
```
|
||||||
|
|
||||||
|
3.2 Add to DNS (Registrar)
|
||||||
|
|
||||||
|
In your DNS provider (e.g., GoDaddy or Cloudflare):
|
||||||
|
|
||||||
|
Add:
|
||||||
|
```
|
||||||
|
Type: TXT
|
||||||
|
Host: @
|
||||||
|
Value: fm-domain-verification=abc123xyz
|
||||||
|
TTL: 300
|
||||||
|
```
|
||||||
|
|
||||||
|
3.3 Wait for propagation
|
||||||
|
```
|
||||||
|
~5–15 minutes typical, but may be as much as 24 hours
|
||||||
|
```
|
||||||
|
|
||||||
|
3.4 Verify in Fastmail
|
||||||
|
|
||||||
|
Click:
|
||||||
|
```
|
||||||
|
Verify Domain
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected Result
|
||||||
|
- Domain verified successfully
|
||||||
|
|
||||||
|
**Step 4 - Set Domain as Default**
|
||||||
|
|
||||||
|
In Fastmail:
|
||||||
|
```
|
||||||
|
Settings → Domains → company.com → Set as default
|
||||||
|
```
|
||||||
|
|
||||||
|
This ensures:
|
||||||
|
|
||||||
|
- new users → user@company.com
|
||||||
|
|
||||||
|
|
||||||
|
**Step 5 - Create Initial Admin Mailbox**
|
||||||
|
|
||||||
|
5.1 Navigate to Users
|
||||||
|
```
|
||||||
|
Settings → Users → Add User
|
||||||
|
```
|
||||||
|
|
||||||
|
5.2 Create admin user
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```
|
||||||
|
Username: admin
|
||||||
|
Email: admin@company.com
|
||||||
|
Password: (strong password)
|
||||||
|
```
|
||||||
|
|
||||||
|
5.3 Save
|
||||||
|
|
||||||
|
Expected Result
|
||||||
|
|
||||||
|
- Mailbox created
|
||||||
|
- Can send/receive (after DNS setup in 3.8)
|
||||||
|
|
||||||
|
|
||||||
|
**Step 6 - Basic Access Test (Pre-DNS)**
|
||||||
|
|
||||||
|
Login via:
|
||||||
|
```
|
||||||
|
https://app.fastmail.com
|
||||||
|
```
|
||||||
|
|
||||||
|
Expected
|
||||||
|
- Inbox accessible
|
||||||
|
- Account functional (even before MX setup)
|
||||||
|
- Email is NOT functional yet
|
||||||
|
|
||||||
|
**Validation Checklist**
|
||||||
|
- [✔] Fastmail account created
|
||||||
|
- [✔] Domain added to Fastmail
|
||||||
|
- [✔] TXT verification record created
|
||||||
|
- [✔] Domain verified
|
||||||
|
- [✔] Default domain set
|
||||||
|
- [✔] Admin mailbox created
|
||||||
|
- [✔] Able to login to Fastmail
|
||||||
|
|
||||||
|
### 3.17 Configure Email DNS
|
||||||
|
|
||||||
|
**Objective**
|
||||||
|
|
||||||
|
Make your domain fully capable of sending and receiving email by configuring DNS records required by Fastmail:
|
||||||
|
|
||||||
|
- Incoming mail routing (MX)
|
||||||
|
- Authorized senders (SPF)
|
||||||
|
- Cryptographic signing (DKIM)
|
||||||
|
- Policy & reporting (DMARC)
|
||||||
|
|
||||||
|
*Changing MX records WILL impact live email.*
|
||||||
|
|
||||||
|
If the client currently uses another provider:
|
||||||
|
|
||||||
|
- Schedule a cutover window
|
||||||
|
- Lower TTL beforehand (if possible)
|
||||||
|
- Expect brief delivery delays during propagation
|
||||||
|
|
||||||
|
**Prerequisites**
|
||||||
|
- Domain added & verified in Fastmail (Task 3.7)
|
||||||
|
- Access to DNS registrar
|
||||||
|
- Admin mailbox created
|
||||||
|
|
||||||
|
**Step 1 - Gather Fastmail DNS Records**
|
||||||
|
|
||||||
|
In Fastmail:
|
||||||
|
```
|
||||||
|
Settings → Domains → company.com → DNS Settings
|
||||||
|
```
|
||||||
|
|
||||||
|
Fastmail will provide all required records. Use those exact values if they differ from below.
|
||||||
|
|
||||||
|
**Step 2 - Configure MX Records (Mail Routing)**
|
||||||
|
|
||||||
|
2.1 Remove Existing MX Records
|
||||||
|
|
||||||
|
⚠️ Only do this at cutover time.
|
||||||
|
|
||||||
|
2.2 Add Fastmail MX Records
|
||||||
|
```
|
||||||
|
Type: MX
|
||||||
|
Host: @
|
||||||
|
Priority: 10
|
||||||
|
Value: in1-smtp.messagingengine.com
|
||||||
|
|
||||||
|
Type: MX
|
||||||
|
Host: @
|
||||||
|
Priority: 20
|
||||||
|
Value: in2-smtp.messagingengine.com
|
||||||
|
```
|
||||||
|
|
||||||
|
**Step 3 - Configure SPF (Sender Authorization)**
|
||||||
|
|
||||||
|
3.1 Add SPF record
|
||||||
|
```
|
||||||
|
Type: TXT
|
||||||
|
Host: @
|
||||||
|
Value: v=spf1 include:spf.messagingengine.com ~all
|
||||||
|
TTL: 300
|
||||||
|
```
|
||||||
|
|
||||||
|
Notes
|
||||||
|
- Only ONE SPF record per domain
|
||||||
|
- Merge with existing SPF if present
|
||||||
|
|
||||||
|
**Step 4 - Configure DKIM (Email Signing)**
|
||||||
|
|
||||||
|
4.1 Get DKIM from Fastmail
|
||||||
|
|
||||||
|
In Fastmail DNS settings, copy the DKIM record.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
```
|
||||||
|
Type: CNAME
|
||||||
|
Host: fm1._domainkey
|
||||||
|
Value: fm1.company.com.dkim.fmhosted.com
|
||||||
|
|
||||||
|
Type: CNAME
|
||||||
|
Host: fm2._domainkey
|
||||||
|
Value: fm2.company.com.dkim.fmhosted.com
|
||||||
|
|
||||||
|
Type: CNAME
|
||||||
|
Host: fm3._domainkey
|
||||||
|
Value: fm3.company.com.dkim.fmhosted.com
|
||||||
|
4.2 Add all DKIM records
|
||||||
|
```
|
||||||
|
|
||||||
|
These enable:
|
||||||
|
- Email authenticity verification
|
||||||
|
- Better deliverability
|
||||||
|
|
||||||
|
**Step 5 - Configure DMARC (Policy & Reporting)**
|
||||||
|
|
||||||
|
5.1 Add DMARC record
|
||||||
|
```
|
||||||
|
Type: TXT
|
||||||
|
Host: _dmarc
|
||||||
|
Value: v=DMARC1; p=none; rua=mailto:admin@company.com
|
||||||
|
TTL: 300
|
||||||
|
```
|
||||||
|
|
||||||
|
Explanation
|
||||||
|
- p=none → monitor only (safe for pilot)
|
||||||
|
- rua= → aggregate reports sent to admin mailbox
|
||||||
|
|
||||||
|
Future Hardening
|
||||||
|
Later you can move to:
|
||||||
|
- p=quarantine → soft enforcement
|
||||||
|
- p=reject → full enforcement
|
||||||
|
|
||||||
|
**Step 6 - Verify DNS Propagation**
|
||||||
|
|
||||||
|
6.1 Check MX
|
||||||
|
nslookup -type=MX company.com
|
||||||
|
|
||||||
|
Expected:
|
||||||
|
|
||||||
|
in1-smtp.messagingengine.com
|
||||||
|
in2-smtp.messagingengine.com
|
||||||
|
6.2 Check SPF
|
||||||
|
nslookup -type=TXT company.com
|
||||||
|
6.3 Check DKIM
|
||||||
|
nslookup -type=CNAME fm1._domainkey.company.com
|
||||||
|
6.4 Check DMARC
|
||||||
|
nslookup -type=TXT _dmarc.company.com
|
||||||
|
|
||||||
|
**Step 7 - Functional Email Test**
|
||||||
|
7.1 Send inbound test
|
||||||
|
|
||||||
|
From Gmail/Outlook:
|
||||||
|
```
|
||||||
|
Send email to: admin@company.com
|
||||||
|
```
|
||||||
|
Expected:
|
||||||
|
- Email received in Fastmail inbox
|
||||||
|
|
||||||
|
7.2 Send outbound test
|
||||||
|
|
||||||
|
From Fastmail:
|
||||||
|
```
|
||||||
|
Send email to external address
|
||||||
|
```
|
||||||
|
Expected:
|
||||||
|
- Email delivered
|
||||||
|
- Not marked as spam
|
||||||
|
|
||||||
|
**Step 8 - Validate Deliverability (Recommended)**
|
||||||
|
|
||||||
|
Use:
|
||||||
|
|
||||||
|
- mail-tester.com
|
||||||
|
- mxtoolbox.com
|
||||||
|
|
||||||
|
Expected
|
||||||
|
- SPF pass
|
||||||
|
- DKIM pass
|
||||||
|
- DMARC pass
|
||||||
|
- Low spam score
|
||||||
|
|
||||||
|
**Step 9 - Propagation Expectations**
|
||||||
|
- MX: 5–30 minutes typical
|
||||||
|
- SPF: immediate to 1 hour
|
||||||
|
- DKIM: 15–60 minutes
|
||||||
|
- DMARC: 15–60 minutes
|
||||||
|
|
||||||
|
Worst case:
|
||||||
|
Up to 24 hours
|
||||||
|
|
||||||
|
**Validation Checklist**
|
||||||
|
- [✔] MX records updated
|
||||||
|
- [✔] SPF record present
|
||||||
|
- [✔] DKIM records configured (all 3)
|
||||||
|
- [✔] DMARC record created
|
||||||
|
- [✔] DNS resolves correctly
|
||||||
|
- [✔] Email received externally
|
||||||
|
- [✔] Email sent externally
|
||||||
|
- [✔] Deliverability validated
|
||||||
|
|
||||||
Reference in New Issue
Block a user