postgis.yml.xxx 6.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209
  1. # https://hub.docker.com/r/crunchydata/crunchy-postgres-gis/tags
  2. ---
  3. version: "3.4"
  4. services:
  5. primary:
  6. hostname: 'primary'
  7. ports:
  8. - target: 5432
  9. published: 5432
  10. protocol: tcp
  11. # mode: host
  12. mode: ingress
  13. image: crunchydata/crunchy-postgres-gis:centos7-12.4-3.0-4.4.1
  14. environment:
  15. - PGHOST=/tmp
  16. - MAX_CONNECTIONS=30
  17. - MAX_WAL_SENDERS=5
  18. - PG_MODE=primary
  19. - PG_PRIMARY_USER=primaryuser
  20. - PG_PRIMARY_PASSWORD=C9DNCIqtQ8x8f0aROyWnC9DNCIqtQ8x8f0aROyWn
  21. - PG_DATABASE=testdb
  22. - PG_USER=testuser
  23. - PG_PASSWORD=xPQ6Quhtk2hQefcIJobAr1Nm9icXjf
  24. - PG_ROOT_PASSWORD=R36aVTUKgOWgawMRvSVqZ4LfYWswZc
  25. - PG_PRIMARY_PORT=5432
  26. volumes:
  27. - pg-primary-vol:/pgdata
  28. - pg-primary-vol-pgconf:/pgconf
  29. - pg-primary-vol-pgwal:/pgwal
  30. - pg-primary-vol-recover:/recover
  31. - pg-primary-vol-sshd:/sshd
  32. - pg-primary-vol-backrestrepo:/backrestrepo
  33. - backups:/srv/backups
  34. # ports:
  35. # - "5432"
  36. networks:
  37. # - crunchynet
  38. # - galera_galera_network
  39. - db-network
  40. - db-external
  41. deploy:
  42. replicas: 1
  43. mode: replicated
  44. placement:
  45. constraints:
  46. # - node.labels.type == primary
  47. - node.role == manager
  48. - node.hostname == hetzner
  49. replica:
  50. image: crunchydata/crunchy-postgres-gis:centos7-12.4-3.0-4.4.1
  51. environment:
  52. - PGHOST=/tmp
  53. - MAX_CONNECTIONS=30
  54. - MAX_WAL_SENDERS=5
  55. - PG_MODE=replica
  56. - PG_PRIMARY_HOST=primary
  57. - PG_PRIMARY_PORT=5432
  58. - PG_PRIMARY_USER=primaryuser
  59. - PG_PRIMARY_PASSWORD=C9DNCIqtQ8x8f0aROyWnC9DNCIqtQ8x8f0aROyWn
  60. - PG_DATABASE=testdb
  61. - PG_USER=testuser
  62. - PG_PASSWORD=xPQ6Quhtk2hQefcIJobAr1Nm9icXjf
  63. - PG_ROOT_PASSWORD=R36aVTUKgOWgawMRvSVqZ4LfYWswZc
  64. volumes:
  65. - pg-replica-vol:/pgdata
  66. - pg-replica-vol-pgconf:/pgconf
  67. - pg-replica-vol-pgwal:/pgwal
  68. - pg-replica-vol-recover:/recover
  69. - pg-replica-vol-sshd:/sshd
  70. - pg-replica-vol-backrestrepo:/backrestrepo
  71. - backups:/srv/backups
  72. # ports:
  73. # - "5432"
  74. networks:
  75. - db-network
  76. - db-external
  77. deploy:
  78. replicas: 1
  79. mode: replicated
  80. placement:
  81. constraints:
  82. # - node.labels.type != primary
  83. - node.role == manager
  84. - node.hostname == hetzner
  85. dbclient:
  86. image: alpine
  87. environment:
  88. - BACKUP_ENABLED=1
  89. - BACKUP_INTERVAL=86400
  90. - BACKUP_PATH=/srv/backups
  91. - BACKUP_FILENAME=swarm_db_backup_postgis
  92. - PG_PRIMARY_USER=primaryuser
  93. - PG_PRIMARY_PASSWORD=C9DNCIqtQ8x8f0aROyWnC9DNCIqtQ8x8f0aROyWn
  94. - PG_USER=testuser
  95. - PG_PASSWORD=xPQ6Quhtk2hQefcIJobAr1Nm9icXjf
  96. - PG_ROOT_PASSWORD=R36aVTUKgOWgawMRvSVqZ4LfYWswZc
  97. networks:
  98. - db-network
  99. entrypoint:
  100. - /bin/sh
  101. - -c
  102. - |
  103. apk add --no-cache postgresql-client
  104. # Ootame, et andmebaas oleks valmis
  105. echo "Waiting for database..."
  106. until PGPASSWORD=$${PG_ROOT_PASSWORD} pg_isready -h primary -U postgres; do
  107. echo "Database unavailable - sleeping"
  108. sleep 5
  109. done
  110. echo "Database is ready!"
  111. while true; do
  112. if [ $${BACKUP_ENABLED} -eq 1 ]; then
  113. echo "Starting backup at $$(date)"
  114. mkdir -p $${BACKUP_PATH}/$$(date +%F)
  115. TIMESTAMP=$$(date +%FT%H-%M)
  116. BACKUP_FILE="$${BACKUP_PATH}/$$(date +%F)/$${BACKUP_FILENAME}-$${TIMESTAMP}.sql.gz"
  117. echo "Making backup to: $${BACKUP_FILE}"
  118. export PGPASSWORD=$${PG_ROOT_PASSWORD}
  119. pg_dumpall -U postgres -h primary --exclude-database=osm_estonia --exclude-database=transport --exclude-database=postgres | gzip > $${BACKUP_FILE}
  120. if [ $$? -eq 0 ]; then
  121. echo "Backup completed successfully"
  122. ls -lh $${BACKUP_FILE}
  123. else
  124. echo "ERROR: Backup failed!"
  125. fi
  126. # Kustuta vanad varundused (vanemad kui 7 päeva)
  127. echo "Cleaning up old backups..."
  128. find $${BACKUP_PATH} -type f -name "*.sql.gz" -mtime +7 -delete
  129. # Arvuta järgmise varukoopia aeg
  130. NEXT_TIME=$$(( $$(date +%s) + $${BACKUP_INTERVAL} ))
  131. NEXT_BACKUP=$$(date -d @$${NEXT_TIME} '+%F %H:%M' 2>/dev/null || date -r $${NEXT_TIME} '+%F %H:%M')
  132. echo "Next backup scheduled at: $${NEXT_BACKUP}"
  133. sleep $${BACKUP_INTERVAL}
  134. else
  135. echo "Backup is disabled"
  136. sleep 3600
  137. fi
  138. done
  139. volumes:
  140. - backups:/srv/backups
  141. - /etc/localtime:/etc/localtime
  142. deploy:
  143. mode: replicated
  144. replicas: 1
  145. placement:
  146. constraints:
  147. - node.role == manager
  148. - node.hostname == hetzner
  149. networks:
  150. # crunchynet:
  151. db-network:
  152. external: true
  153. db-external:
  154. external: true
  155. volumes:
  156. # dbclient:
  157. backups:
  158. pg-primary-vol:
  159. name: '{{.Service.Name}}-{{.Task.Slot}}-pgdata'
  160. driver: local
  161. pg-primary-vol-pgconf:
  162. name: '{{.Service.Name}}-{{.Task.Slot}}-pgconf'
  163. driver: local
  164. pg-primary-vol-pgwal:
  165. name: '{{.Service.Name}}-{{.Task.Slot}}-pgwal'
  166. driver: local
  167. pg-primary-vol-recover:
  168. name: '{{.Service.Name}}-{{.Task.Slot}}-recover'
  169. driver: local
  170. pg-primary-vol-sshd:
  171. name: '{{.Service.Name}}-{{.Task.Slot}}-sshd'
  172. driver: local
  173. pg-primary-vol-backrestrepo:
  174. name: '{{.Service.Name}}-{{.Task.Slot}}-backrestrepo'
  175. driver: local
  176. pg-replica-vol:
  177. name: '{{.Service.Name}}-{{.Task.Slot}}-pgdata'
  178. driver: local
  179. pg-replica-vol-pgconf:
  180. name: '{{.Service.Name}}-{{.Task.Slot}}-pgconf'
  181. driver: local
  182. pg-replica-vol-pgwal:
  183. name: '{{.Service.Name}}-{{.Task.Slot}}-pgwal'
  184. driver: local
  185. pg-replica-vol-recover:
  186. name: '{{.Service.Name}}-{{.Task.Slot}}-recover'
  187. driver: local
  188. pg-replica-vol-sshd:
  189. name: '{{.Service.Name}}-{{.Task.Slot}}-sshd'
  190. driver: local
  191. pg-replica-vol-backrestrepo:
  192. name: '{{.Service.Name}}-{{.Task.Slot}}-backrestrepo'
  193. driver: local