Create: infrastructure/vm-102-matrix-synapse.md
This commit is contained in:
@@ -0,0 +1,214 @@
|
||||
---
|
||||
created: '2026-04-11T16:32:16+00:00'
|
||||
id: 96c4de5f-0dd1-4cdb-a13d-dca95cf3ebcb
|
||||
keywords:
|
||||
- matrix.pfi.local
|
||||
- synapse
|
||||
- element-web
|
||||
- 10.250.50.70
|
||||
- VM-102
|
||||
- PFI-ANA-Docker
|
||||
- postgres:16
|
||||
- appservice
|
||||
- AIPA
|
||||
links: []
|
||||
modified: '2026-04-11T16:32:16+00:00'
|
||||
summary: Docker deployment of Synapse homeserver with PostgreSQL and Element Web on
|
||||
VM 102 (PFI-ANA-Docker). Covers compose file, configuration, storage paths, and
|
||||
admin setup.
|
||||
tags:
|
||||
- infrastructure
|
||||
- pfi
|
||||
- pfi-ana
|
||||
- matrix
|
||||
- docker
|
||||
- vm-102
|
||||
- synapse
|
||||
- self-hosted
|
||||
- deployment
|
||||
title: VM 102 — Matrix Synapse Deployment
|
||||
---
|
||||
|
||||
VM 102 (PFI-ANA-Docker, 10.250.50.70) hosts the Matrix stack as the primary human-to-agent communication channel for AIPA.
|
||||
|
||||
## Components
|
||||
|
||||
| Component | Image | Port | Purpose |
|
||||
|---|---|---|---|
|
||||
| synapse | matrixdotorg/synapse:latest | 8008 | Matrix homeserver (Client-Server API) |
|
||||
| synapse-db | postgres:16 | — | Synapse database |
|
||||
| element-web | vectorim/element-web:latest | 8080 | Web client for users |
|
||||
|
||||
## Storage Paths
|
||||
|
||||
| Host Path | Purpose |
|
||||
|---|---|
|
||||
| /opt/docker/compose/synapse/ | Compose file (managed by Dockge) |
|
||||
| /opt/docker/conf/synapse/ | Configuration files |
|
||||
| /opt/docker/data/synapse/ | Synapse data (homeserver.yaml, signing keys, appservice reg) |
|
||||
|
||||
### Volumes
|
||||
|
||||
| Volume / Path | Container Path | Purpose |
|
||||
|---|---|---|
|
||||
| /opt/docker/data/synapse | /data | Synapse config, signing keys, media store |
|
||||
| synapse-db-data (named vol) | /var/lib/postgresql/data | PostgreSQL persistent data |
|
||||
|
||||
## Deployment Steps
|
||||
|
||||
### 1. Create directories
|
||||
```bash
|
||||
mkdir -p /opt/docker/data/synapse
|
||||
mkdir -p /opt/docker/conf/synapse
|
||||
mkdir -p /opt/docker/compose/synapse
|
||||
```
|
||||
|
||||
### 2. Generate Synapse config
|
||||
```bash
|
||||
docker run --rm \
|
||||
-v /opt/docker/data/synapse:/data \
|
||||
-e SYNAPSE_SERVER_NAME=matrix.pfi.local \
|
||||
-e SYNAPSE_REPORT_STATS=no \
|
||||
matrixdotorg/synapse:latest generate
|
||||
```
|
||||
|
||||
Do not modify server_name after generation — it is permanent.
|
||||
|
||||
### 3. Edit homeserver.yaml
|
||||
|
||||
```yaml
|
||||
database:
|
||||
name: psycopg2
|
||||
args:
|
||||
user: synapse
|
||||
password: synapse_db_password
|
||||
database: synapse
|
||||
host: synapse-db
|
||||
cp_min: 5
|
||||
cp_max: 10
|
||||
|
||||
enable_registration: false
|
||||
federation_domain_whitelist: []
|
||||
|
||||
app_service_config_files:
|
||||
- /data/aipa_appservice.yaml
|
||||
```
|
||||
|
||||
### 4. Docker Compose
|
||||
|
||||
File: /opt/docker/compose/synapse/docker-compose.yml
|
||||
|
||||
```yaml
|
||||
---
|
||||
services:
|
||||
synapse-db:
|
||||
image: postgres:16
|
||||
container_name: synapse-db
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
POSTGRES_USER: synapse
|
||||
POSTGRES_PASSWORD: synapse_db_password
|
||||
POSTGRES_DB: synapse
|
||||
POSTGRES_INITDB_ARGS: "--encoding=UTF-8 --lc-collate=C --lc-ctype=C"
|
||||
volumes:
|
||||
- synapse-db-data:/var/lib/postgresql/data
|
||||
networks:
|
||||
- synapse-net
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U synapse"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
synapse:
|
||||
image: matrixdotorg/synapse:latest
|
||||
container_name: synapse
|
||||
restart: unless-stopped
|
||||
depends_on:
|
||||
synapse-db:
|
||||
condition: service_healthy
|
||||
ports:
|
||||
- "8008:8008"
|
||||
volumes:
|
||||
- /opt/docker/data/synapse:/data
|
||||
networks:
|
||||
- synapse-net
|
||||
deploy:
|
||||
resources:
|
||||
limits:
|
||||
memory: 1G
|
||||
cpus: "2.0"
|
||||
reservations:
|
||||
memory: 256M
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "curl -fsS http://localhost:8008/health || exit 1"]
|
||||
interval: 30s
|
||||
timeout: 10s
|
||||
retries: 3
|
||||
start_period: 30s
|
||||
|
||||
element-web:
|
||||
image: vectorim/element-web:latest
|
||||
container_name: element-web
|
||||
restart: unless-stopped
|
||||
volumes:
|
||||
- /opt/docker/conf/synapse/element-config.json:/app/config.json:ro
|
||||
ports:
|
||||
- "8080:80"
|
||||
networks:
|
||||
- synapse-net
|
||||
|
||||
volumes:
|
||||
synapse-db-data:
|
||||
|
||||
networks:
|
||||
synapse-net:
|
||||
name: synapse-net
|
||||
```
|
||||
|
||||
Start: `cd /opt/docker/compose/synapse && docker compose up -d`
|
||||
Verify: `curl http://localhost:8008/health`
|
||||
|
||||
### 5. Element Web config
|
||||
|
||||
File: /opt/docker/conf/synapse/element-config.json
|
||||
|
||||
```json
|
||||
{
|
||||
"default_server_config": {
|
||||
"m.homeserver": {
|
||||
"base_url": "http://10.250.50.70:8008",
|
||||
"server_name": "matrix.pfi.local"
|
||||
}
|
||||
},
|
||||
"brand": "AIPA",
|
||||
"default_theme": "dark",
|
||||
"disable_guests": true,
|
||||
"disable_login_language_selector": true
|
||||
}
|
||||
```
|
||||
|
||||
### 6. Create admin user
|
||||
```bash
|
||||
docker exec -it synapse register_new_matrix_user -u admin -p 'yourpassword' -a http://localhost:8008
|
||||
```
|
||||
|
||||
Agent users (@atlas, @linus, @hermione) are virtual — managed by the appservice. Do not register them as real accounts.
|
||||
|
||||
## Network
|
||||
|
||||
Uses dedicated synapse-net (not traefik-net) because Synapse is accessed directly by IP. If TLS/reverse proxy is needed later, join traefik-net and add Traefik labels.
|
||||
|
||||
## Port Allocation
|
||||
|
||||
| Port | Service | Protocol |
|
||||
|---|---|---|
|
||||
| 8008 | Synapse | HTTP |
|
||||
| 8080 | Element Web | HTTP |
|
||||
| 8009 | AIPA Bridge | HTTP |
|
||||
|
||||
## Security Notes
|
||||
- Registration disabled (enable_registration: false)
|
||||
- Federation disabled (federation_domain_whitelist: [])
|
||||
- as_token and hs_token are admin-equivalent secrets — store in env.sh, never commit
|
||||
- For external access, put behind TLS-terminating reverse proxy
|
||||
Reference in New Issue
Block a user