summaryrefslogtreecommitdiff
path: root/yaml/postgres.yaml
blob: e53ea4387e7536a0d54dbcb2b14b566351bef2de (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
  name: local-storage
provisioner: kubernetes.io/no-provisioner
volumeBindingMode: WaitForFirstConsumer
---
apiVersion: v1
kind: PersistentVolume
metadata:
  name: pgdata-pv
spec:
  capacity:
    storage: 1Gi
  accessModes:
    - ReadWriteOnce
  storageClassName: local-storage
  local:
    path: /mnt/data/postgres
  nodeAffinity:
    required:
      nodeSelectorTerms:
      - matchExpressions:
        - key: kubernetes.io/hostname
          operator: In
          values:
          - cas-sanluca1
---
apiVersion: v1
kind: Secret
metadata:
  name: postgres-credentials
type: Opaque
stringData:
  POSTGRES_USER: postgres
  POSTGRES_PASSWORD: password
  POSTGRES_DB: gis
---
apiVersion: v1
kind: ConfigMap
metadata:
  name: postgres-init-scripts
data:
  init.sql: |
    CREATE EXTENSION postgis;

    CREATE TABLE users(
        id SERIAL NOT NULL,
        email text NOT NULL,
        password text NOT NULL,
        name text NULL,
        address text NULL,
        notification_token text NULL,
        is_admin boolean default false,
        PRIMARY KEY (id)
    );

    CREATE TYPE moving_activity AS ENUM ('InVehicle', 'Running', 'Walking', 'Still');

    CREATE TABLE positions(
        id SERIAL NOT NULL,
        user_id INTEGER NOT NULL,
        created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
        location GEOGRAPHY(Point, 4326) NOT NULL,
        activity moving_activity NOT NULL,
        PRIMARY KEY(id),
        CONSTRAINT fk_users_id
            FOREIGN KEY(user_id) REFERENCES users(id)
            ON DELETE CASCADE,
        CONSTRAINT unique_user_position UNIQUE(user_id)
    );

    CREATE TYPE level_alert AS ENUM ('One', 'Two', 'Three');

    CREATE TABLE alerts(
        id SERIAL NOT NULL,
        user_id INTEGER NOT NULL,
        created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
        area GEOMETRY(Polygon, 4326),
        text1 text NOT NULL,
        text2 text NOT NULL,
        text3 text NOT NULL,
        audio1 bytea NOT NULL,
        audio2 bytea NOT NULL,
        audio3 bytea NOT NULL,
        reached_users INTEGER DEFAULT 0 NOT NULL,
        PRIMARY KEY(id),
        CONSTRAINT fk_users_id 
            FOREIGN KEY(user_id) REFERENCES users(id)
            ON DELETE CASCADE
    );

    CREATE TABLE notifications(
        id SERIAL NOT NULL,
        alert_id INTEGER NOT NULL,
        user_id INTEGER NOT NULL,
        location GEOGRAPHY(Point, 4326) NOT NULL,
        activity moving_activity NOT NULL,
        seen BOOLEAN DEFAULT false,
        level level_alert NOT NULL,
        created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
        PRIMARY KEY(id),
        CONSTRAINT fk_alerts_id
            FOREIGN KEY(alert_id) REFERENCES alerts(id)
            ON DELETE CASCADE,
        CONSTRAINT fk_users_id
            FOREIGN KEY(user_id) REFERENCES users(id)
            ON DELETE CASCADE
    );
---
apiVersion: apps/v1
kind: Deployment
metadata:
  name: postgres-deployment
spec:
  replicas: 1
  selector:
    matchLabels:
      app: postgres
  template:
    metadata:
      labels:
        app: postgres
    spec:
      tolerations:
      - key: node-role.kubernetes.io/control-plane
        operator: Exists
        effect: NoSchedule
      securityContext:
        fsGroup: 999
      containers:
        - name: postgres
          image: postgis/postgis:16-3.4
          envFrom:
            - secretRef:
                name: postgres-credentials
          ports:
            - containerPort: 5432
          volumeMounts:
            - mountPath: /var/lib/postgresql/data
              name: pgdata
            - mountPath: /docker-entrypoint-initdb.d
              name: init-scripts
          resources:
            requests:
              cpu: 250m
              memory: 512Mi
            limits:
              cpu: 500m
              memory: 1Gi
      volumes:
        - name: pgdata
          persistentVolumeClaim:
            claimName: pgdata-pvc
        - name: init-scripts
          configMap:
            name: postgres-init-scripts
---
apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: pgdata-pvc
spec:
  storageClassName: local-storage
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 1Gi
---
apiVersion: v1
kind: Service
metadata:
  name: postgres-service
spec:
  ports:
    - port: 5432
      targetPort: 5432
  selector:
    app: postgres
  type: ClusterIP
---
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
  name: allow-cas-postgres
spec:
  podSelector:
    matchLabels:
      app: cas
  policyTypes:
  - Ingress
  ingress:
  - from:
      - podSelector:
          matchLabels:
            app: postgres
    ports:
    - protocol: TCP
      port: 5432