Closed bikeymouse closed 4 years ago
Goed punt! Ik ga het uitzoeken....
Sorry, daar kan ik niet bij helpen. Je zou dan even moeten kijken wat de mogelijkheden zijn voor de postgres:10.5-alpine image op https://hub.docker.com/_/postgres
Hi, dank voor de link, daar stond de oplossing op basis waarvan ik het heb kunnen fixen.
Voor de geïnteresseerde: je kunt dit doen door user: "1000:1000" toe te voegen aan je docker-compose.yml en daarbij read-only toegang te geven tot de /etc/passwd file op je systeem door de regel toe te voegen bij de volume sectie:
@bikeymouse zou je kunnen aangeven op welke plekken in de docker-compose.yml deze aanpassing moet komen?
Hi,
Ik heb het zowel zowel voor de "dsmrdb" service als voor de "dsmr" service toegevoegd zie ik.
Ik heb voor de zekerheid ook onderstaande toevoeging nog laten staan in bij de environment, maar die worden dus mogelijk niet gebruikt door het script van xirixiz:
Let wel op dat die Id's overeenkomen met de user die je default gebruikt buiten de Docker-container.
Mijn volledige docker-compose.yml ziet er zo uit, als iemand nog aanvullingen/correcties hierop heeft hou ik me aanbevolen ;-)
(p.s. zie ook dat ik alle environment variabelen heb toegevoegd om de configuratie te sturen, inclusief als dat nog op de default waarden staat. Dat help om duidelijk te maken welke opties er zijn).
version: '3.8'
services:
dsmrdb:
image: postgres:12-alpine
container_name: dsmrdb
volumes:
- ./dsmrdb:/var/lib/postgresql/data
- /etc/localtime:/etc/localtime:ro
- /etc/passwd:/etc/passwd:ro
restart: unless-stopped
user: "1000:1000"
environment:
- TZ=Europe/Amsterdam
- PG_TZ=Europe/Amsterdam
- POSTGRES_USER=dsmrreader
- POSTGRES_PASSWORD=dsmrreader
- POSTGRES_DB=dsmrreader
- PUID=1000
- PGID=1000
ports:
- 5432:5432
networks:
- dsmrdb
dsmr:
image: xirixiz/dsmr-reader-docker:latest
container_name: dsmr
volumes:
- /etc/localtime:/etc/localtime:ro
- ./dsmrdb_backups:/dsmr/backups
depends_on:
- dsmrdb
cap_add:
- NET_ADMIN
networks:
- dsmrdb
restart: unless-stopped
environment:
- DATALOGGER_MODE=standalone
- DATALOGGER_INPUT_METHOD=serial # Required. Only serial or ipv4 (network) are valid values
- DATALOGGER_SERIAL_PORT=/dev/ttyUSB0 # Required if the input method is set to serial
- DATALOGGER_SERIAL_BAUDRATE=115200 # Required if the input method is set to serial
- SD_LOGLEVEL=info
- SD_USER=root
- SD_GROUP=root
- DSMR_LOGLEVEL=WARNING
- DSMR_USER=dsmrreader
- DSMR_PASSWORD=dsmrreader
- DB_HOST=dsmrdb
- DB_USER=dsmrreader
- DB_PASS=dsmrreader
- DB_NAME=dsmrreader
- DB_PORT=5432
- TZ=Europe/Amsterdam
- DJANGO_TIME_ZONE=Europe/Amsterdam
- VIRTUAL_HOST=localhost
- PUID=1000
- PGID=1000
ports:
- 7777:80
- 7779:443
devices:
- /dev/P1-Meter:/dev/ttyUSB0
networks:
dsmrdb:
name: dsmrdb
Ik krijg met bovenstaand (behalve die 2 devices regels want ik gebruik een wifi reader) de volgende meldingen in de logs: Heb gebruiker pi en die heeft id 1000.
Als ik docker-compose up dsmrdb doe dan krijg ik het volgende
dsmrdb | chmod: /var/lib/postgresql/data: Operation not permitted dsmrdb | chmod: /var/run/postgresql: Operation not permitted dsmrdb | initdb: error: could not change permissions of directory "/var/lib/postgresql/data": Operation not permitted dsmrdb | The files belonging to this database system will be owned by user "pi". dsmrdb | This user must also own the server process. dsmrdb | dsmrdb | The database cluster will be initialized with locale "en_US.utf8". dsmrdb | The default database encoding has accordingly been set to "UTF8". dsmrdb | The default text search configuration will be set to "english". dsmrdb | dsmrdb | Data page checksums are disabled. dsmrdb | dsmrdb | fixing permissions on existing directory /var/lib/postgresql/data ... root@HomePiOne:/home/pi#
Doe ik een volledige docker-compose up -d dan krijg ik het volgende.
Het is mij onduidelijk wat ik hier aan kan doen.
`
[ INFO ] Verifying if the DSMR web credential variables have been set...
[ INFO ] Fixing /dev/ttyUSB security...
[ INFO ] Removing existing PID files...
[ INFO ] Creating log directory...
[ INFO ] Verifying Database connectivity...
dsmr | Traceback (most recent call last):
dsmr | File "/usr/local/lib/python3.9/site-packages/django/db/backends/base/base.py", line 219, in ensure_connection
dsmr | self.connect()
dsmr | File "/usr/local/lib/python3.9/site-packages/django/utils/asyncio.py", line 26, in inner
dsmr | return func(args, kwargs)
dsmr | File "/usr/local/lib/python3.9/site-packages/django/db/backends/base/base.py", line 200, in connect
dsmr | self.connection = self.get_new_connection(conn_params)
dsmr | File "/usr/local/lib/python3.9/site-packages/django/utils/asyncio.py", line 26, in inner
dsmr | return func(*args, kwargs)
dsmr | File "/usr/local/lib/python3.9/site-packages/django/db/backends/postgresql/base.py", line 187, in get_new_connection
dsmr | connection = Database.connect(conn_params)
dsmr | File "/usr/local/lib/python3.9/site-packages/psycopg2/init.py", line 127, in connect
dsmr | conn = _connect(dsn, connection_factory=connection_factory, *kwasync)
dsmr | psycopg2.OperationalError: could not translate host name "dsmrdb" to address: Name does not resolve
dsmr |
dsmr |
dsmr | The above exception was the direct cause of the following exception:
dsmr |
dsmr | Traceback (most recent call last):
dsmr | File "/dsmr/manage.py", line 10, in
`
Hi,
Ik heb het zowel zowel voor de "dsmrdb" service als voor de "dsmr" service toegevoegd zie ik.
Ik heb voor de zekerheid ook onderstaande toevoeging nog laten staan in bij de environment, maar die worden dus mogelijk niet gebruikt door het script van xirixiz:
- PUID=1000
- PGID=1000
Let wel op dat die Id's overeenkomen met de user die je default gebruikt buiten de Docker-container.
Mijn volledige docker-compose.yml ziet er zo uit, als iemand nog aanvullingen/correcties hierop heeft hou ik me aanbevolen ;-)
(p.s. zie ook dat ik alle environment variabelen heb toegevoegd om de configuratie te sturen, inclusief als dat nog op de default waarden staat. Dat help om duidelijk te maken welke opties er zijn).
version: '3.8' services: dsmrdb: image: postgres:12-alpine container_name: dsmrdb volumes: - ./dsmrdb:/var/lib/postgresql/data - /etc/localtime:/etc/localtime:ro - /etc/passwd:/etc/passwd:ro restart: unless-stopped user: "1000:1000" environment: - TZ=Europe/Amsterdam - PG_TZ=Europe/Amsterdam - POSTGRES_USER=dsmrreader - POSTGRES_PASSWORD=dsmrreader - POSTGRES_DB=dsmrreader - PUID=1000 - PGID=1000 ports: - 5432:5432 networks: - dsmrdb dsmr: image: xirixiz/dsmr-reader-docker:latest container_name: dsmr volumes: - /etc/localtime:/etc/localtime:ro - ./dsmrdb_backups:/dsmr/backups depends_on: - dsmrdb cap_add: - NET_ADMIN networks: - dsmrdb restart: unless-stopped environment: - DATALOGGER_MODE=standalone - DATALOGGER_INPUT_METHOD=serial # Required. Only serial or ipv4 (network) are valid values - DATALOGGER_SERIAL_PORT=/dev/ttyUSB0 # Required if the input method is set to serial - DATALOGGER_SERIAL_BAUDRATE=115200 # Required if the input method is set to serial - SD_LOGLEVEL=info - SD_USER=root - SD_GROUP=root - DSMR_LOGLEVEL=WARNING - DSMR_USER=dsmrreader - DSMR_PASSWORD=dsmrreader - DB_HOST=dsmrdb - DB_USER=dsmrreader - DB_PASS=dsmrreader - DB_NAME=dsmrreader - DB_PORT=5432 - TZ=Europe/Amsterdam - DJANGO_TIME_ZONE=Europe/Amsterdam - VIRTUAL_HOST=localhost - PUID=1000 - PGID=1000 ports: - 7777:80 - 7779:443 devices: - /dev/P1-Meter:/dev/ttyUSB0 networks: dsmrdb: name: dsmrdb
Het gevaar is wel dat je er dan variabelen tussen hebt staan die niet meer bestaan cq gebruikt worden, zoals db_host, db_user, db_pass, etc. Ik zou even in de README kijken :)
Ik krijg met bovenstaand (behalve die 2 devices regels want ik gebruik een wifi reader) de volgende meldingen in de logs: Heb gebruiker pi en die heeft id 1000.
Als ik docker-compose up dsmrdb doe dan krijg ik het volgende
dsmrdb | chmod: /var/lib/postgresql/data: Operation not permitted dsmrdb | chmod: /var/run/postgresql: Operation not permitted dsmrdb | initdb: error: could not change permissions of directory "/var/lib/postgresql/data": Operation not permitted dsmrdb | The files belonging to this database system will be owned by user "pi". dsmrdb | This user must also own the server process. dsmrdb | dsmrdb | The database cluster will be initialized with locale "en_US.utf8". dsmrdb | The default database encoding has accordingly been set to "UTF8". dsmrdb | The default text search configuration will be set to "english". dsmrdb | dsmrdb | Data page checksums are disabled. dsmrdb | dsmrdb | fixing permissions on existing directory /var/lib/postgresql/data ... root@HomePiOne:/home/pi#
Doe ik een volledige docker-compose up -d dan krijg ik het volgende. Het is mij onduidelijk wat ik hier aan kan doen. ` [ INFO ] Verifying if the DSMR web credential variables have been set... [ INFO ] Fixing /dev/ttyUSB security... [ INFO ] Removing existing PID files... [ INFO ] Creating log directory... [ INFO ] Verifying Database connectivity... dsmr | Traceback (most recent call last): dsmr | File "/usr/local/lib/python3.9/site-packages/django/db/backends/base/base.py", line 219, in ensure_connection dsmr | self.connect() dsmr | File "/usr/local/lib/python3.9/site-packages/django/utils/asyncio.py", line 26, in inner dsmr | return func(args, kwargs) dsmr | File "/usr/local/lib/python3.9/site-packages/django/db/backends/base/base.py", line 200, in connect dsmr | self.connection = self.get_new_connection(conn_params) dsmr | File "/usr/local/lib/python3.9/site-packages/django/utils/asyncio.py", line 26, in inner dsmr | return func(*args, kwargs) dsmr | File "/usr/local/lib/python3.9/site-packages/django/db/backends/postgresql/base.py", line 187, in get_new_connection dsmr | connection = Database.connect(conn_params) dsmr | File "/usr/local/lib/python3.9/site-packages/psycopg2/init.py", line 127, in connect dsmr | conn = _connect(dsn, connection_factory=connection_factory, kwasync) dsmr | psycopg2.OperationalError: could not translate host name "dsmrdb" to address: Name does not resolve dsmr | dsmr | dsmr | The above exception was the direct cause of the following exception: dsmr | dsmr | Traceback (most recent call last): dsmr | File "/dsmr/manage.py", line 10, in dsmr | execute_from_command_line(sys.argv) dsmr | File "/usr/local/lib/python3.9/site-packages/django/core/management/init.py", line 401, in execute_from_command_line dsmr | utility.execute() dsmr | File "/usr/local/lib/python3.9/site-packages/django/core/management/init*.py", line 395, in execute dsmr | self.fetch_command(subcommand).run_from_argv(self.argv) dsmr | File "/usr/local/lib/python3.9/site-packages/django/core/management/base.py", line 330, in run_from_argv dsmr | self.execute(args, cmd_options) dsmr | File "/usr/local/lib/python3.9/site-packages/django/core/management/base.py", line 371, in execute dsmr | output = self.handle(*args, options) dsmr | File "/usr/local/lib/python3.9/site-packages/django/core/management/commands/shell.py", line 87, in handle dsmr | exec(options['command']) dsmr | File "", line 1, in dsmr | File "/usr/local/lib/python3.9/site-packages/django/utils/asyncio.py", line 26, in inner dsmr | return func(*args, kwargs) dsmr | File "/usr/local/lib/python3.9/site-packages/django/db/backends/base/base.py", line 219, in ensure_connection dsmr | self.connect() dsmr | File "/usr/local/lib/python3.9/site-packages/django/db/utils.py", line 90, in exit* dsmr | raise dj_exc_value.with_traceback(traceback) from exc_value dsmr | File "/usr/local/lib/python3.9/site-packages/django/db/backends/base/base.py", line 219, in ensure_connection dsmr | self.connect() dsmr | File "/usr/local/lib/python3.9/site-packages/django/utils/asyncio.py", line 26, in inner dsmr | return func(args, kwargs) dsmr | File "/usr/local/lib/python3.9/site-packages/django/db/backends/base/base.py", line 200, in connect dsmr | self.connection = self.get_new_connection(conn_params) dsmr | File "/usr/local/lib/python3.9/site-packages/django/utils/asyncio.py", line 26, in inner dsmr | return func(*args, kwargs) dsmr | File "/usr/local/lib/python3.9/site-packages/django/db/backends/postgresql/base.py", line 187, in get_new_connection dsmr | connection = Database.connect(conn_params) dsmr | File "/usr/local/lib/python3.9/site-packages/psycopg2/init.py", line 127, in connect dsmr | conn = _connect(dsn, connection_factory=connection_factory, **kwasync) dsmr | django.db.utils.OperationalError: could not translate host name "dsmrdb" to address: Name does not resolve dsmr | [ FAIL ] Could not connect to database server. Exiting...
`
Logisch, want wanneer de db niet kan starten, dan kan dsmr daar ook niet mee verbinden. Het probleem is een rechtenissue tussen het host systeem en de Docker volume mount. Je zal dat eerst moeten oplossen zodat dsmrdb fatsoenlijk kan starten, pas daarna kan je met dsmr aan de bak. Je zou er ook voor kunnen kiezen om Docker named volumes te gebruiken.
https://serverfault.com/questions/996785/docker-volumes-vs-mount-binds-what-are-the-use-cases
Ik krijg met bovenstaand (behalve die 2 devices regels want ik gebruik een wifi reader) de volgende meldingen in de logs: Heb gebruiker pi en die heeft id 1000.
Als ik docker-compose up dsmrdb doe dan krijg ik het volgende
dsmrdb | chmod: /var/lib/postgresql/data: Operation not permitted dsmrdb | chmod: /var/run/postgresql: Operation not permitted dsmrdb | initdb: error: could not change permissions of directory "/var/lib/postgresql/data": Operation not permitted dsmrdb | The files belonging to this database system will be owned by user "pi". dsmrdb | This user must also own the server process. dsmrdb | dsmrdb | The database cluster will be initialized with locale "en_US.utf8". dsmrdb | The default database encoding has accordingly been set to "UTF8". dsmrdb | The default text search configuration will be set to "english". dsmrdb | dsmrdb | Data page checksums are disabled. dsmrdb | dsmrdb | fixing permissions on existing directory /var/lib/postgresql/data ... root@HomePiOne:/home/pi#
Mmm, heeft de pi user wel toegang tot de ./dsmrdb directory van DSMRDB? Misschien staat die user nog verkeerd van de vorige keer opstarten. Kun je wijzigen door chown -R pi:pi * te gebruiken.
Vaag overigens dat in je log wel wordt aangegeven (blijkbaar zonder resultaat):
dsmrdb | dsmrdb | fixing permissions on existing directory /var/lib/postgresql/data ... root@HomePiOne:/home/pi#
Wat ik mij zelf nu echter afvroeg is waarom ik het extra command in de sectie voor de dsmrdb service heb gezet. Het probleem zat hem immers in de rechten voor de dsmrdb_backups directory, en die wordt door door de dsmr service aangemaakt.
Het is alleen al weer een tijd geleden inmiddels maak ik geen gebruik meer van de Raspberry Pi (draai nu Proxmox op een IntelNuC), en zie dat nu all backups "root" als eigenaar hebben. Gebruik nu ander backup mechanisme en heb er daarom geen last meer van. Heb nog wel even gekeken wat er gebeurt als ik user: "1000:1000" en een extra volume:
Kortom heb het maar even zo gelaten ;-)
De tip van xirixiz om named volumes te gebruiken is ook een goede, daarmee lost je het probleem ook op. Enige nadeeltje daaraan vindt ik dat de locatie van je databestanden wat moeilijker te vinden (en dus te back-uppen) is, omdat het dan ergens in een lange subdirectory-structuur onder Docker zit.
Het gevaar is wel dat je er dan variabelen tussen hebt staan die niet meer bestaan cq gebruikt worden, zoals db_host, db_user, db_pass, etc. Ik zou even in de README kijken :)
Goede tip! ;-) Dat was inderdaad nogal verouderd, heb dat even opgeschoond.
heb bij de 2 ./ regels een extra dsmrreader mapje gezet zodat het in een submap komt. De hoofdmap en beide submappen hebben root als eigennaar. Dit is dus al anders omdat het eerst 70 was.
Ik heb ook maar een beetje opgeschoond aan variabelen...verder las ik in de readme :) dat ik de mode kon aanpassen. Heb dus ook ipv4 aangepast, maar dat lijkt mij niet meteen het probleem waarom het bij mij mis gaat.
blijf toch nog met dit zitten
initdb: error: could not change permissions of directory "/var/lib/postgresql/data": Operation not permitted dsmrdb | fixing permissions on existing directory /var/lib/postgresql/data ... chmod: /var/lib/postgresql/data: Operation not permitted dsmrdb | chmod: /var/run/postgresql: Operation not permitted
Nog wat geprobeerd met volumes maar bovenstaande melding blijft.
`
version: '3.8'
services:
dsmrdb:
image: postgres:12-alpine
container_name: dsmrdb
volumes:
- data-progres:/var/lib/postgresql/data
- /etc/localtime:/etc/localtime:ro
- /etc/passwd:/etc/passwd:ro
restart: unless-stopped
user: "1000:1000"
environment:
- TZ=Europe/Amsterdam
- PG_TZ=Europe/Amsterdam
- POSTGRES_USER=dsmrreader
- POSTGRES_PASSWORD=dsmrreader
- POSTGRES_DB=dsmrreader
- PUID=1000
- PGID=1000
ports:
- 5432:5432
networks:
- dsmrdb
dsmr:
image: xirixiz/dsmr-reader-docker:latest
container_name: dsmr
volumes:
- /etc/localtime:/etc/localtime:ro
- data-dsmrbackups:/dsmr/backups
depends_on:
- dsmrdb
cap_add:
- NET_ADMIN
networks:
- dsmrdb
restart: unless-stopped
environment:
- DATALOGGER_MODE=standalone
- DATALOGGER_INPUT_METHOD=ipv4 # Required. Only serial or ipv4 (network) are valid values
- DATALOGGER_NETWORK_HOST=192.168.1.108 # Required if the input method is set to ipv4
- DATALOGGER_NETWORK_PORT=23
- TZ=Europe/Amsterdam
- DJANGO_TIME_ZONE=Europe/Amsterdam
- VIRTUAL_HOST=localhost
- PUID=1000
- PGID=1000
ports:
- 7777:80
- 7779:443
networks:
dsmrdb:
name: dsmrdb
volumes:
data-progres:
driver: local
data-dsmrbackups:
driver: local
Is “pi” wel owner van je data-progres map?
Volgens mij is het voordeel van named volumes dat je geen rechten zet. De "map" wordt ook door docker zelf toegekend (virtueel). Ik heb het teruggezet naar bind mounts. Mijn pi user is lid van de group homepi die heb ik recursief als group op de dsmrreader map gezet. pi heb ik recursief owner gemaakt en de rechten recursief op 775 gezet. Zodra ik docker-compose up -d doe veranderen de rechten van de db map naar 0700. Foutmelding blijft aan de containerkant mis gaan (als ik het goed interpreteer)
dsmrdb | initdb: error: could not change permissions of directory "/var/lib/postgresql/data": Operation not permitted
dsmrdb | fixing permissions on existing directory /var/lib/postgresql/data ... chmod: /var/lib/postgresql/data: Operation not permitted
dsmrdb | chmod: /var/run/postgresql: Operation not permitted
dsmrdb | The files belonging to this database system will be owned by user "pi".
dsmrdb | This user must also own the server process.
Overigens ik heb ook het docker image van conculega ualex73 geprobeerd en die start wel op met onderstaande code die vrijwel gelijk is aan zijn voorbeeld code. Al lukt daar het backuppen ook niet.
version: '3'
services:
db-dsmr:
image: postgres
container_name: db-dsmr
volumes:
- ./dsmrreader/db:/var/lib/postgresql/data
restart: unless-stopped
environment:
- POSTGRES_USER=dsmrreader
- POSTGRES_PASSWORD=dsmrreader
- POSTGRES_DB=dsmrreader
networks:
- net-dsmr
dsmr:
container_name: dsmr
image: ualex73/dsmr-reader-docker
container_name: dsmr
restart: unless-stopped
volumes:
- ./dsmrreader/backups:/home/dsmr/app/backups
- /dev:/dev
environment:
- DB_HOST=db-dsmr
- DSMR_USER=admin
- DSMR_EMAIL=root@localhost
- DSMR_PASSWORD=admin
- VIRTUAL_HOST=localhost
- DSMRREADER_ADMIN_USER=admin
- DSMRREADER_ADMIN_PASSWORD=password
ports:
- 8888:80
# devices:
# - /dev/ttyUSB0:/dev/ttyUSB0
networks:
- net-dsmr
networks:
net-dsmr:
driver: bridge
Dat het wel lukt met de compose file van ualex staat hier los van, de config is appels met peren vergelijken door alle opgenomen extra settings. Hieronder een voorbeeld wat voldoende moet zijn voor het starten van PG12.. Er is een rechtenissue en wanneer je de config gelijk zou trekken vwb de database, hetzelfde resultaat zou moeten hebben.
Het probleem dat er nu ontstaat is dat ualex "latest" gebruikt voor postgres, de reden waarom backups aan de client kant niet werken. De PG13 client is namelijk niet beschikbaar voor de bronimage waar dsmr op draait, dus de client "begrijpt" de postgres omgeving niet waardoor er geen backup gemaakt kan worden. Dit is de reden waarom ik versie 12 van PG heb gedefinieerd in mijn compose file.
Het probleem dat jouw database niet start kan nu dus ook zijn dat PG12 jouw files niet "begrijpt". Wanneer met met de compose file van ualex start, dan is jouw database waarschijnlijk gebasseerd op PG13 en niet op PG12.
Ik zou de hele folder even verwijderen, opnieuw aanmaken (777) en de DB opstarten zoals in het onderstaande voorbeeld. Kijken of PG12 uberhaupt start zonder issues. Van daaruit zou ik het verder gaan onderzoeken.
Kortom weer wat werk en test mogelijkheden en hopelijk wat meer duidelijkheid :).
Hier zou je op een later moment, in geval van communicatie issues tussen de containers onderling nog even naar kunnen kijken: https://docs.docker.com/network/bridge/#enable-forwarding-from-docker-containers-to-the-outside-world
version: '3.8'
services:
dsmrdb:
image: postgres:12-alpine
container_name: dsmrdb
volumes:
- ./dsmrreader/db:/var/lib/postgresql/data
- /etc/localtime:/etc/localtime:ro
restart: unless-stopped
environment:
- TZ=Europe/Amsterdam
- PG_TZ=Europe/Amsterdam
- POSTGRES_USER=dsmrreader
- POSTGRES_PASSWORD=dsmrreader
- POSTGRES_DB=dsmrreader
networks:
- dsmrdb
Je kan ook eenvoudig beginnen met alleen een compose file die er bijv zo uit ziet:
version: '3.8'
volumes:
pg-data:
services:
database:
image: postgres:latest
restart: always
environment:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: postgres
PGDATA: /pg-data
ports:
- "5432:5432"
volumes:
- pg-data:/pg-data
...hmm something other popped up. What is the underlying os you're using? selinux might be causing these permission issues as well...
More infor using the :z or :Z flag: https://www.redhat.com/sysadmin/user-namespaces-selinux-rootless-containers
ik draai raspian buster dus debian op de rpi. Je onderste database connectie ging goed. Die erboven met eerst de dsmrreader map en de db map aanmaken en op allebei 777 rechten en dan docker opstarten geeft dit in de logs
dsmrdb | 1970-04-25 12:43:04.009 CET [1] LOG: starting PostgreSQL 12.5 on arm-unknown-linux-musleabihf, compiled by gcc (Alpine 10.2.1_pre1) 10.2.1 20201203, 32-bit
dsmrdb | 1970-04-25 12:43:04.009 CET [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
dsmrdb | 1970-04-25 12:43:04.009 CET [1] LOG: listening on IPv6 address "::", port 5432
dsmrdb | 1970-04-25 12:43:04.009 CET [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
dsmrdb | 1970-04-25 12:43:04.009 CET [1] LOG: startup process (PID 21) was terminated by signal 11: Segmentation fault
dsmrdb | 1970-04-25 12:43:04.009 CET [1] LOG: aborting startup due to startup process failure
dsmrdb | 1970-04-25 12:43:04.009 CET [1] LOG: database system is shut down
dsmrdb |
dsmrdb | PostgreSQL Database directory appears to contain a database; Skipping initialization
dsmrdb |
dsmrdb | 1970-04-27 12:30:16.009 CET [1] LOG: starting PostgreSQL 12.5 on arm-unknown-linux-musleabihf, compiled by gcc (Alpine 10.2.1_pre1) 10.2.1 20201203, 32-bit
dsmrdb | 1970-04-27 12:30:16.009 CET [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
dsmrdb | 1970-04-27 12:30:16.009 CET [1] LOG: listening on IPv6 address "::", port 5432
dsmrdb | 1970-04-27 12:30:16.009 CET [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
dsmrdb | 1970-04-27 12:30:16.009 CET [1] LOG: startup process (PID 23) was terminated by signal 11: Segmentation fault
dsmrdb | 1970-04-27 12:30:16.009 CET [1] LOG: aborting startup due to startup process failure
dsmrdb | 1970-04-27 12:30:16.009 CET [1] LOG: database system is shut down
dsmrdb |
dsmrdb | PostgreSQL Database directory appears to contain a database; Skipping initialization
dsmrdb |
dsmrdb | 1970-04-25 18:24:24.009 CET [1] LOG: starting PostgreSQL 12.5 on arm-unknown-linux-musleabihf, compiled by gcc (Alpine 10.2.1_pre1) 10.2.1 20201203, 32-bit
dsmrdb | 1970-04-25 18:24:24.009 CET [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
dsmrdb | 1970-04-25 18:24:24.009 CET [1] LOG: listening on IPv6 address "::", port 5432
dsmrdb | 1970-04-25 18:24:24.009 CET [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
dsmrdb | 1970-04-25 18:24:24.009 CET [1] LOG: startup process (PID 21) was terminated by signal 11: Segmentation fault
dsmrdb | 1970-04-25 18:24:24.009 CET [1] LOG: aborting startup due to startup process failure
dsmrdb | 1970-04-25 18:24:24.009 CET [1] LOG: database system is shut down
image: postgres:12-alpine vervangen door image: postgres geeft
dsmrdb |
dsmrdb | PostgreSQL Database directory appears to contain a database; Skipping initialization
dsmrdb |
dsmrdb | 2021-01-31 12:14:35.310 CET [1] FATAL: database files are incompatible with server
dsmrdb | 2021-01-31 12:14:35.310 CET [1] DETAIL: The data directory was initialized by PostgreSQL version 12, which is not compatible with this version 13.1 (Debian 13.1-1.pgdg100+1).
dsmrdb |
dsmrdb | PostgreSQL Database directory appears to contain a database; Skipping initialization
dsmrdb |
dsmrdb | 2021-01-31 12:14:37.972 CET [1] FATAL: database files are incompatible with server
dsmrdb | 2021-01-31 12:14:37.972 CET [1] DETAIL: The data directory was initialized by PostgreSQL version 12, which is not compatible with this version 13.1 (Debian 13.1-1.pgdg100+1).
dsmrdb |
dsmrdb | PostgreSQL Database directory appears to contain a database; Skipping initialization
dsmrdb |
dsmrdb | 2021-01-31 12:14:40.782 CET [1] FATAL: database files are incompatible with server
dsmrdb | 2021-01-31 12:14:40.782 CET [1] DETAIL: The data directory was initialized by PostgreSQL version 12, which is not compatible with this version 13.1 (Debian 13.1-1.pgdg100+1).
doe ik schoon en dan image: postgres dan krijg ik het zelfde bij de pg12 optie.
Doe ik weer alles schoon en image: postgres:latest
dsmrdb |
dsmrdb | 2021-01-31 12:34:18.781 CET [1] LOG: starting PostgreSQL 13.1 (Debian 13.1-1.pgdg100+1) on arm-unknown-linux-gnueabihf, compiled by gcc (Debian 8.3.0-6) 8.3.0, 32-bit
dsmrdb | 2021-01-31 12:34:18.783 CET [1] LOG: listening on IPv4 address "0.0.0.0", port 5432
dsmrdb | 2021-01-31 12:34:18.783 CET [1] LOG: listening on IPv6 address "::", port 5432
dsmrdb | 2021-01-31 12:34:18.794 CET [1] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
dsmrdb | 2021-01-31 12:34:18.814 CET [77] LOG: database system was shut down at 2021-01-31 12:34:18 CET
dsmrdb | 2021-01-31 12:34:18.839 CET [1] LOG: database system is ready to accept connections
Wat opvalt is dat bij postgres 12 de datum en tijd van de logs alle kanten opvliegen. Bij de anderen is die gewoon actueel. Nu kijken of het dsmr gedeelte wil opstarten.
Ok met 13.1 lukt het wel om dsmr op te starten. Rechten op db map wordt dan ook 999 ipv 70 zoals het oorspronkelijk was met 12.1 Backups gaat echter nog niet. Rechten op dsmrreader map en op de backups map is: Group = root[0] Owner = root[0] octal = 0755 Op de db map is het: Group = root[0] Owner = 999[999] octal = 0700 Uitlezen van wifi p1-lezer op x.x.x.x met poort 23 lukt. Backup geeft melding: Backup creation failed, please check the dsmr_backend logfile.
Heb mijn originele dedicated dsmrreader installatie nog draaien (die ik dus in docker wil zetten samen met mij Home Assistant docker). Hier is het pad naar de backups: /home/dsmr/dsmr-reader/backups/archive/2021/01 waarvan de dsmr user owner is deze is in mijn docker dus vervangen door
gelukt om de dsmr_backend logfile te openen en daar vind ik dit.
[2021-01-31 15:38:03,139] CRITICAL - Unexpected exit code (1) for backup: b'could not find a "pg_dump" to execute\npg_dump: error: server version: 13.1 (Debian 13.1-1.pgdg100+1); pg_dump version: 12.5\npg_dump: error: aborting because of server version mismatch\n' [2021-01-31 15:38:03,153] ERROR (OSError) dsmr_backup.services.backup.run errored: b'could not find a "pg_dump" to execute\npg_dump: error: server version: 13.1 (Debian 13.1-1.pgdg100+1); pg_dump version: 12.5\npg_dump: error: aborting because of server version mismatch\n'
Begrijp ik het goed dat dsmr-reader 12.5 wil hebben maar die niet werkt op een rpi en door 13.1 te installeren vervolgens dsmr geen dump meer kan maken omdat de versie te nieuw is?
Dat begrijp je goed, dat is wat ik eerder aangaf. Op dit moment is er voor de base image van dsmr reader geen versie 13 beschikbaar van de PG client tools, alleen voor versie 12 of lager.
Oke ik heb het nu aangepast naar image: postgres:12 en dat lijkt het te doen. Kwam deze regel ergens tegen: If you click on those tags, you'll see the underlying Dockerfile. One is based on debian, the other on alpine, Raspian is debian dus niet alpine :)
Dat is de distro die als base gebruikt wordt in de Docker image, dat heeft geen enkele relatie met het host os, raspian in dit geval :). Het enige dat van belang is, is de architectuur van de host voor wat betreft de image die je nodig hebt.
Alpine wordt vaak gebruikt als base omdat het zeer klein is voor de basis van een Docker image.
Ik geloof je helemaal alleen als ik het onderstaande uitvoer dan is de owner van de db folder 999 en als ik postgres:12-alpine gebruik dan wordt dit 70. Ik heb de folder dsmrreader tussendoor verwijderd. Er lijkt dus toch verschil in te zitten (in iedergeval op mijn rpi). Ik zal het een tijdje laten draaien
version: '3.8'
services:
dsmrdb:
image: postgres:12
container_name: dsmrdb
volumes:
- ./dsmrreader/db:/var/lib/postgresql/data
- /etc/localtime:/etc/localtime:ro
restart: unless-stopped
environment:
- TZ=Europe/Amsterdam
- PG_TZ=Europe/Amsterdam
- POSTGRES_USER=dsmrreader
- POSTGRES_PASSWORD=dsmrreader
- POSTGRES_DB=dsmrreader
networks:
- dsmrdb
dsmr:
image: xirixiz/dsmr-reader-docker:latest
container_name: dsmr
volumes:
- /etc/localtime:/etc/localtime:ro
- ./dsmrreader/backups:/dsmr/backups
- ./dsmrreader/logs:/var/log/supervisor
depends_on:
- dsmrdb
cap_add:
- NET_ADMIN
networks:
- dsmrdb
restart: unless-stopped
environment:
- DATALOGGER_MODE=standalone
- TZ=Europe/Amsterdam
- DJANGO_TIME_ZONE=Europe/Amsterdam
- VIRTUAL_HOST=localhost
ports:
- 7777:80
- 7779:443
networks:
dsmrdb:
name: dsmrdb
Ah, oke, dat is wel interessant idd. Dat zou dan idd een afwijking zijn van de images van postgres. Ik zal er eens induiken en kijken of ik kan vinden waar het zit. Tenminste als de PG Dockerfiles inzichtelijk zijn, anders zouden we iig een issue kunnen aanmaken. Voor nu zou ik het dan idd hierbij laten en niet de Alpine image gebruiken.
Ik heb het inderdaad gezien nu, en er is daar ook een discussie over gaande. Een dirty hack is er ook om de uid en guid te zetten. Ik zou het persoonlijk niet gebruiken, maar dat is een persoonlijke keuze.
entrypoint: ["sh", "-c", "sed -e '/^postgres/s=^postgres:x:[0-9]*:[0-9]*:=postgres:x:${OWNER_UID}:${OWNER_GID}:=' -i /etc/passwd; sed -e '/^postgres/s=^postgres:x:[0-9]*:=postgres:x:${OWNER_GID}:=' -i /etc/group; exec docker-entrypoint.sh postgres"]
Ik geloof je helemaal alleen als ik het onderstaande uitvoer dan is de owner van de db folder 999 en als ik postgres:12-alpine gebruik dan wordt dit 70. Ik heb de folder dsmrreader tussendoor verwijderd. Er lijkt dus toch verschil in te zitten (in iedergeval op mijn rpi). Ik zal het een tijdje laten draaien
version: '3.8' services: dsmrdb: image: postgres:12 container_name: dsmrdb volumes: - ./dsmrreader/db:/var/lib/postgresql/data - /etc/localtime:/etc/localtime:ro restart: unless-stopped environment: - TZ=Europe/Amsterdam - PG_TZ=Europe/Amsterdam - POSTGRES_USER=dsmrreader - POSTGRES_PASSWORD=dsmrreader - POSTGRES_DB=dsmrreader networks: - dsmrdb dsmr: image: xirixiz/dsmr-reader-docker:latest container_name: dsmr volumes: - /etc/localtime:/etc/localtime:ro - ./dsmrreader/backups:/dsmr/backups - ./dsmrreader/logs:/var/log/supervisor depends_on: - dsmrdb cap_add: - NET_ADMIN networks: - dsmrdb restart: unless-stopped environment: - DATALOGGER_MODE=standalone - TZ=Europe/Amsterdam - DJANGO_TIME_ZONE=Europe/Amsterdam - VIRTUAL_HOST=localhost ports: - 7777:80 - 7779:443 networks: dsmrdb: name: dsmrdb
Wat gebeurt er met de rechten van de ./dsmrreader/db folder als je in bij de dsmrdb sectie toevoegt:
user: "1000:1000"
en bij de volumes:
- /etc/passwd:/etc/passwd:ro
@bikeymouse als ik die regels toevoeg dan krijg ik bij beide db images 12 en 12-alpine de onderstaande foutmelding. De owner van de db map is dan root.
dsmr |
dsmr | The above exception was the direct cause of the following exception:
dsmr |
dsmr | Traceback (most recent call last):
dsmr | File "/dsmr/manage.py", line 10, in <module>
dsmr | execute_from_command_line(sys.argv)
dsmr | File "/usr/local/lib/python3.9/site-packages/django/core/management/__init__.py", line 401, in execute_from_command_line
dsmr | utility.execute()
dsmr | File "/usr/local/lib/python3.9/site-packages/django/core/management/__init__.py", line 395, in execute
dsmr | self.fetch_command(subcommand).run_from_argv(self.argv)
dsmr | File "/usr/local/lib/python3.9/site-packages/django/core/management/base.py", line 330, in run_from_argv
dsmr | self.execute(*args, **cmd_options)
dsmr | File "/usr/local/lib/python3.9/site-packages/django/core/management/base.py", line 371, in execute
dsmr | output = self.handle(*args, **options)
dsmr | File "/usr/local/lib/python3.9/site-packages/django/core/management/commands/shell.py", line 87, in handle
dsmr | exec(options['command'])
dsmr | File "<string>", line 1, in <module>
dsmr | File "/usr/local/lib/python3.9/site-packages/django/utils/asyncio.py", line 26, in inner
dsmr | return func(*args, **kwargs)
dsmr | File "/usr/local/lib/python3.9/site-packages/django/db/backends/base/base.py", line 219, in ensure_connection
dsmr | self.connect()
dsmr | File "/usr/local/lib/python3.9/site-packages/django/db/utils.py", line 90, in __exit__
dsmr | raise dj_exc_value.with_traceback(traceback) from exc_value
dsmr | File "/usr/local/lib/python3.9/site-packages/django/db/backends/base/base.py", line 219, in ensure_connection
dsmr | self.connect()
dsmr | File "/usr/local/lib/python3.9/site-packages/django/utils/asyncio.py", line 26, in inner
dsmr | return func(*args, **kwargs)
dsmr | File "/usr/local/lib/python3.9/site-packages/django/db/backends/base/base.py", line 200, in connect
dsmr | self.connection = self.get_new_connection(conn_params)
dsmr | File "/usr/local/lib/python3.9/site-packages/django/utils/asyncio.py", line 26, in inner
dsmr | return func(*args, **kwargs)
dsmr | File "/usr/local/lib/python3.9/site-packages/django/db/backends/postgresql/base.py", line 187, in get_new_connection
dsmr | connection = Database.connect(**conn_params)
dsmr | File "/usr/local/lib/python3.9/site-packages/psycopg2/__init__.py", line 127, in connect
dsmr | conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
dsmr | django.db.utils.OperationalError: could not translate host name "dsmrdb" to address: Name does not resolve
@bikeymouse als ik die regels toevoeg dan krijg ik bij beide db images 12 en 12-alpine de onderstaande foutmelding. De owner van de db map is dan root.
dsmr | django.db.utils.OperationalError: could not translate host name "dsmrdb" to address: Name does not resolve
Dat ziet er naar uit dat je zowel Postgress als DSMR start, waarbij deze melding lijkt aan te geven dat dat de dsmrdb-service niet bekend is c.q. de container niet opgestart is. Blijkbaar crashed DSMR dan ook.
Ik heb even een test gedaan met een verse virtual machine (in Proxmox) met daarop alleen Docker, docker-compose en Portainer geïnstalleerd. Daar heb alleen de Postgress 12 container gestart met de volgende docker-compose:
version: '3.6'
services:
dsmrdb:
image: postgres:10.5-alpine
container_name: dsmrdb
volumes:
- ./dsmrdb:/var/lib/postgresql/data
- /etc/localtime:/etc/localtime:ro
- /etc/passwd:/etc/passwd:ro
restart: unless-stopped
user: "1000:1000"
environment:
- TZ=Europe/Amsterdam
- POSTGRES_USER=dsmrreader
- POSTGRES_PASSWORD=dsmrreader
- POSTGRES_DB=dsmrreader
ports:
- 5432:5432
networks:
- dsmrdb
networks:
dsmrdb:
name: dsmrdb
Dat start prima op:
The files belonging to this database system will be owned by user "bikey".
This user must also own the server process.
...etc...
Data page checksums are disabled.
fixing permissions on existing directory /var/lib/postgresql/data ... ok
creating subdirectories ... ok
etc...
2021-02-01 23:08:06.620 CET [1] LOG: database system is ready to accept connections
De image herkent dus dat ik onder een andere user wil werken en past de rechten aan. Als ik tenslotte de ./dsrmdb directory bekijk en de gecreëerde bestanden hebben die allemaal prima de goede eigenaar:
bikey@test:~/dsmr/dsmrdb$ ls -lh
total 120K
-rw------- 1 bikey bikey 3 Feb 1 22:08 PG_VERSION
drwx------ 6 bikey bikey 4.0K Feb 1 22:08 base
drwx------ 2 bikey bikey 4.0K Feb 1 22:11 global
drwx------ 2 bikey bikey 4.0K Feb 1 22:08 pg_commit_ts
drwx------ 2 bikey bikey 4.0K Feb 1 22:08 pg_dynshmem
-rw------- 1 bikey bikey 4.5K Feb 1 22:08 pg_hba.conf
-rw------- 1 bikey bikey 1.6K Feb 1 22:08 pg_ident.conf
drwx------ 4 bikey bikey 4.0K Feb 1 22:10 pg_logical
drwx------ 4 bikey bikey 4.0K Feb 1 22:08 pg_multixact
drwx------ 2 bikey bikey 4.0K Feb 1 22:11 pg_notify
drwx------ 2 bikey bikey 4.0K Feb 1 22:08 pg_replslot
drwx------ 2 bikey bikey 4.0K Feb 1 22:08 pg_serial
drwx------ 2 bikey bikey 4.0K Feb 1 22:08 pg_snapshots
drwx------ 2 bikey bikey 4.0K Feb 1 22:11 pg_stat
drwx------ 2 bikey bikey 4.0K Feb 1 22:11 pg_stat_tmp
drwx------ 2 bikey bikey 4.0K Feb 1 22:08 pg_subtrans
drwx------ 2 bikey bikey 4.0K Feb 1 22:08 pg_tblspc
drwx------ 2 bikey bikey 4.0K Feb 1 22:08 pg_twophase
drwx------ 3 bikey bikey 4.0K Feb 1 22:08 pg_wal
drwx------ 2 bikey bikey 4.0K Feb 1 22:08 pg_xact
-rw------- 1 bikey bikey 88 Feb 1 22:08 postgresql.auto.conf
-rw------- 1 bikey bikey 23K Feb 1 22:08 postgresql.conf
-rw------- 1 bikey bikey 24 Feb 1 22:11 postmaster.opts
-rw------- 1 bikey bikey 94 Feb 1 22:11 postmaster.pid
Misschien is het dus een idee om het langzaam op te bouwen en eerst alleen de database container op te starten.
Even een vraag: ik gebruik de Docker-compose.yml van jouw voorbeeld.
Nu zie ik dat de owner van de ./dsmr directory door de container veranderd wordt naar een user met id "70".
De ./dmsrdb_backups directory blijft wel gewoon van user "pi" en group "pi":
drwx------ 19 70 pi 4.0K Apr 9 11:03 dsmrdb drwxr-xr-x 4 pi pi 4.0K Apr 9 11:12 dsmrdb_backups
Dit geeft problemen met rechten voor bijv. back-ups. Ik zou daarom graag willen dat de owner/group gewoon pi:pi blijft.
Ik heb in de Docker-compose nu deze toevoeging gedaan bij de environment, maar dat lijkt niets uit te maken: environment:
Is dit aan te passen?