Files
homelab-docker-config/central-database/MIGRATION_GUIDE.md
2026-03-08 16:05:21 +01:00

215 lines
5.5 KiB
Markdown

# Service Configuration Migration Guide
This guide shows how to update each service to use the central PostgreSQL database.
## Service-Specific Configuration Updates
### 1. Synapse Matrix
**Current configuration in `synapse/docker-compose.yml`:**
```yaml
synapse_db:
image: docker.io/library/postgres:17
restart: always
volumes:
- ${SYNAPSE_POSTGRES_DATA_DIR}:/var/lib/postgresql/data
environment:
POSTGRES_DB: ${SYNAPSE_POSTGRES_DB}
POSTGRES_USER: ${SYNAPSE_POSTGRES_USER}
POSTGRES_PASSWORD: ${SYNAPSE_POSTGRES_PASSWORD}
POSTGRES_INITDB_ARGS: '--encoding=UTF-8 --locale=C'
ports:
- 5442:5432
synapse:
# ... other config ...
environment:
POSTGRES_HOST: synapse_db
POSTGRES_PORT: 5432
POSTGRES_DB: ${SYNAPSE_POSTGRES_DB}
POSTGRES_USER: ${SYNAPSE_POSTGRES_USER}
POSTGRES_PASSWORD: ${SYNAPSE_POSTGRES_PASSWORD}
```
**Updated configuration:**
```yaml
# Remove the synapse_db service entirely
synapse:
# ... other config ...
environment:
POSTGRES_HOST: postgres
POSTGRES_PORT: 5432
POSTGRES_DB: synapse
POSTGRES_USER: synapse_user
POSTGRES_PASSWORD: ${SYNAPSE_POSTGRES_PASSWORD}
depends_on:
- postgres # Add this dependency
networks:
- default # Ensure same network as postgres container
```
### 2. Paperless
**Current configuration in `paperless/docker-compose.yml`:**
```yaml
db:
image: docker.io/library/postgres:17
restart: always
volumes:
- ${PAPERLESS_POSTGRES_DATA_DIR}:/var/lib/postgresql/data
environment:
POSTGRES_DB: ${PAPERLESS_POSTGRES_DB}
POSTGRES_USER: ${PAPERLESS_POSTGRES_USER}
POSTGRES_PASSWORD: ${PAPERLESS_POSTGRES_PASSWORD}
ports:
- 5434:5432
paperless:
# ... other config ...
environment:
PAPERLESS_DBHOST: db
PAPERLESS_DBNAME: ${PAPERLESS_POSTGRES_DB}
PAPERLESS_DBUSER: ${PAPERLESS_POSTGRES_USER}
PAPERLESS_DBPASS: ${PAPERLESS_POSTGRES_PASSWORD}
```
**Updated configuration:**
```yaml
# Remove the db service entirely
paperless:
# ... other config ...
environment:
PAPERLESS_DBHOST: postgres
PAPERLESS_DBNAME: paperless
PAPERLESS_DBUSER: paperless_user
PAPERLESS_DBPASS: ${PAPERLESS_POSTGRES_PASSWORD}
depends_on:
- postgres # Add this dependency
networks:
- default
```
### 3. Immich
**Current configuration in `immich/docker-compose.yml`:**
```yaml
database:
container_name: immich_postgres
image: ghcr.io/immich-app/postgres:14-vectorchord0.3.0-pgvectors0.2.0
environment:
POSTGRES_USER: ${IMMICH_POSTGRES_USER}
POSTGRES_PASSWORD: ${IMMICH_POSTGRES_PASSWORD}
POSTGRES_DB: ${IMMICH_POSTGRES_DB}
POSTGRES_INITDB_ARGS: '--data-checksums'
ports:
- 5433:5432
volumes:
- ${IMMICH_DB_LOCATION}:/var/lib/postgresql/data
immich-server:
# ... other config ...
environment:
DB_HOSTNAME: ${IMMICH_DB_HOSTNAME}
DB_USERNAME: ${IMMICH_POSTGRES_USER}
DB_PASSWORD: ${IMMICH_POSTGRES_PASSWORD}
DB_DATABASE_NAME: ${IMMICH_POSTGRES_DB}
```
**Updated configuration:**
```yaml
# Remove the database service entirely
immich-server:
# ... other config ...
environment:
DB_HOSTNAME: postgres
DB_USERNAME: immich_user
DB_PASSWORD: ${IMMICH_POSTGRES_PASSWORD}
DB_DATABASE_NAME: immich
depends_on:
- postgres # Add this dependency
networks:
- default
```
### 4. Shlink
**Current configuration in `shlink/docker-compose.yml`:**
```yaml
shlink_db:
image: postgres:17
container_name: shlink_db
restart: always
volumes:
- ${SHLINK_POSTGRES_DIR}:/var/lib/postgresql/data
environment:
POSTGRES_DB: ${SHLINK_POSTGRES_DB}
POSTGRES_USER: ${SHLINK_POSTGRES_USER}
POSTGRES_PASSWORD: ${SHLINK_POSTGRES_PASSWORD}
ports:
- 5436:5432
shlink:
# ... other config ...
environment:
DB_HOST: shlink_db
DB_NAME: ${SHLINK_POSTGRES_DB}
DB_USER: ${SHLINK_POSTGRES_USER}
DB_PASSWORD: ${SHLINK_POSTGRES_PASSWORD}
```
**Updated configuration:**
```yaml
# Remove the shlink_db service entirely
shlink:
# ... other config ...
environment:
DB_HOST: postgres
DB_NAME: shlink
DB_USER: shlink_user
DB_PASSWORD: ${SHLINK_POSTGRES_PASSWORD}
depends_on:
- postgres # Add this dependency
networks:
- default
```
## General Pattern
For each service:
1. **Remove** the service-specific database container
2. **Update** the main service container's environment variables:
- `POSTGRES_HOST`/`DB_HOST``postgres`
- `POSTGRES_PORT`/`DB_PORT``5432`
- `POSTGRES_DB`/`DB_NAME``<service_name>` (e.g., `synapse`, `paperless`)
- `POSTGRES_USER`/`DB_USER``<service_name>_user`
- `POSTGRES_PASSWORD`/`DB_PASSWORD``${SERVICE_POSTGRES_PASSWORD}` (keep existing)
3. **Add dependency** on `postgres` service
4. **Update network** configuration if needed (ensure services can reach postgres container)
## Testing Migration
After updating each service:
1. **Stop the service**: `docker-compose down`
2. **Start with new config**: `docker-compose up -d`
3. **Check logs**: `docker-compose logs -f`
4. **Test functionality**: Verify the service works correctly
5. **Rollback plan**: Keep old database container until migration is confirmed successful
## Network Considerations
Ensure all services are on the same Docker network or can reach the `central_postgres` container. You may need to:
1. Add services to the same network
2. Use Docker's internal DNS
3. Configure network aliases if needed
## Password Management
Keep using the same password variables but ensure they match the central database user passwords. The migration script preserves existing passwords for seamless transition.