postgis.yml 5.8 KB

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