Add admin user
This commit is contained in:
parent
84a6f26b60
commit
f3a2b211ed
99
charts/my-recipes-chart/templates/admin-init-configmap.yaml
Normal file
99
charts/my-recipes-chart/templates/admin-init-configmap.yaml
Normal file
@ -0,0 +1,99 @@
|
|||||||
|
apiVersion: v1
|
||||||
|
kind: ConfigMap
|
||||||
|
metadata:
|
||||||
|
name: {{ .Release.Name }}-admin-init
|
||||||
|
namespace: {{ .Values.global.namespace }}
|
||||||
|
data:
|
||||||
|
create-admin.py: |
|
||||||
|
#!/usr/bin/env python3
|
||||||
|
import os
|
||||||
|
import sys
|
||||||
|
import psycopg2
|
||||||
|
import bcrypt
|
||||||
|
from time import sleep
|
||||||
|
|
||||||
|
def wait_for_db():
|
||||||
|
"""Wait for database to be ready"""
|
||||||
|
max_retries = 30
|
||||||
|
retry_count = 0
|
||||||
|
|
||||||
|
while retry_count < max_retries:
|
||||||
|
try:
|
||||||
|
conn = psycopg2.connect(
|
||||||
|
host=os.environ['DB_HOST'],
|
||||||
|
port=os.environ['DB_PORT'],
|
||||||
|
database=os.environ['DB_NAME'],
|
||||||
|
user=os.environ['DB_USER'],
|
||||||
|
password=os.environ['DB_PASSWORD']
|
||||||
|
)
|
||||||
|
conn.close()
|
||||||
|
print("✓ Database is ready")
|
||||||
|
return True
|
||||||
|
except Exception as e:
|
||||||
|
retry_count += 1
|
||||||
|
print(f"Waiting for database... ({retry_count}/{max_retries})")
|
||||||
|
sleep(2)
|
||||||
|
|
||||||
|
print("✗ Database connection timeout")
|
||||||
|
return False
|
||||||
|
|
||||||
|
def create_admin_user():
|
||||||
|
"""Create admin user if not exists"""
|
||||||
|
try:
|
||||||
|
# Hash the password
|
||||||
|
password = os.environ.get('ADMIN_PASSWORD', 'admin123')
|
||||||
|
password_hash = bcrypt.hashpw(password.encode('utf-8'), bcrypt.gensalt()).decode('utf-8')
|
||||||
|
|
||||||
|
# Connect to database
|
||||||
|
conn = psycopg2.connect(
|
||||||
|
host=os.environ['DB_HOST'],
|
||||||
|
port=os.environ['DB_PORT'],
|
||||||
|
database=os.environ['DB_NAME'],
|
||||||
|
user=os.environ['DB_USER'],
|
||||||
|
password=os.environ['DB_PASSWORD']
|
||||||
|
)
|
||||||
|
cur = conn.cursor()
|
||||||
|
|
||||||
|
# Insert admin user
|
||||||
|
cur.execute("""
|
||||||
|
INSERT INTO users (username, email, password_hash, first_name, last_name, display_name, is_admin)
|
||||||
|
VALUES (%s, %s, %s, %s, %s, %s, %s)
|
||||||
|
ON CONFLICT (username) DO UPDATE SET
|
||||||
|
email = EXCLUDED.email,
|
||||||
|
password_hash = EXCLUDED.password_hash,
|
||||||
|
first_name = EXCLUDED.first_name,
|
||||||
|
last_name = EXCLUDED.last_name,
|
||||||
|
display_name = EXCLUDED.display_name,
|
||||||
|
is_admin = EXCLUDED.is_admin
|
||||||
|
""", (
|
||||||
|
os.environ.get('ADMIN_USERNAME', 'admin'),
|
||||||
|
os.environ.get('ADMIN_EMAIL', 'admin@myrecipes.local'),
|
||||||
|
password_hash,
|
||||||
|
os.environ.get('ADMIN_FIRST_NAME', 'Admin'),
|
||||||
|
os.environ.get('ADMIN_LAST_NAME', 'User'),
|
||||||
|
os.environ.get('ADMIN_DISPLAY_NAME', 'מנהל'),
|
||||||
|
True
|
||||||
|
))
|
||||||
|
|
||||||
|
conn.commit()
|
||||||
|
cur.close()
|
||||||
|
conn.close()
|
||||||
|
|
||||||
|
print(f"✓ Admin user '{os.environ.get('ADMIN_USERNAME', 'admin')}' created/updated successfully")
|
||||||
|
return True
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
print(f"✗ Error creating admin user: {e}")
|
||||||
|
return False
|
||||||
|
|
||||||
|
if __name__ == "__main__":
|
||||||
|
print("Starting admin user initialization...")
|
||||||
|
|
||||||
|
if not wait_for_db():
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
if not create_admin_user():
|
||||||
|
sys.exit(1)
|
||||||
|
|
||||||
|
print("✓ Admin user initialization completed")
|
||||||
|
sys.exit(0)
|
||||||
75
charts/my-recipes-chart/templates/admin-init-job.yaml
Normal file
75
charts/my-recipes-chart/templates/admin-init-job.yaml
Normal file
@ -0,0 +1,75 @@
|
|||||||
|
apiVersion: batch/v1
|
||||||
|
kind: Job
|
||||||
|
metadata:
|
||||||
|
name: {{ .Release.Name }}-admin-init-{{ .Release.Revision }}
|
||||||
|
namespace: {{ .Values.global.namespace }}
|
||||||
|
labels:
|
||||||
|
app: {{ .Release.Name }}-admin-init
|
||||||
|
component: init
|
||||||
|
annotations:
|
||||||
|
"helm.sh/hook": post-install,post-upgrade
|
||||||
|
"helm.sh/hook-weight": "10"
|
||||||
|
"helm.sh/hook-delete-policy": before-hook-creation
|
||||||
|
spec:
|
||||||
|
ttlSecondsAfterFinished: 300
|
||||||
|
template:
|
||||||
|
metadata:
|
||||||
|
labels:
|
||||||
|
app: {{ .Release.Name }}-admin-init
|
||||||
|
spec:
|
||||||
|
restartPolicy: Never
|
||||||
|
containers:
|
||||||
|
- name: admin-init
|
||||||
|
image: python:3.12-slim
|
||||||
|
command:
|
||||||
|
- /bin/sh
|
||||||
|
- -c
|
||||||
|
- |
|
||||||
|
pip install --no-cache-dir psycopg2-binary bcrypt > /dev/null 2>&1
|
||||||
|
python3 /scripts/create-admin.py
|
||||||
|
env:
|
||||||
|
- name: DB_HOST
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ .Release.Name }}-db-credentials
|
||||||
|
key: DB_HOST
|
||||||
|
- name: DB_PORT
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ .Release.Name }}-db-credentials
|
||||||
|
key: DB_PORT
|
||||||
|
- name: DB_NAME
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ .Release.Name }}-db-credentials
|
||||||
|
key: DB_NAME
|
||||||
|
- name: DB_USER
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ .Release.Name }}-db-credentials
|
||||||
|
key: DB_USER
|
||||||
|
- name: DB_PASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: {{ .Release.Name }}-db-credentials
|
||||||
|
key: DB_PASSWORD
|
||||||
|
- name: ADMIN_USERNAME
|
||||||
|
value: {{ .Values.admin.username | quote }}
|
||||||
|
- name: ADMIN_EMAIL
|
||||||
|
value: {{ .Values.admin.email | quote }}
|
||||||
|
- name: ADMIN_PASSWORD
|
||||||
|
value: {{ .Values.admin.password | quote }}
|
||||||
|
- name: ADMIN_FIRST_NAME
|
||||||
|
value: {{ .Values.admin.firstName | quote }}
|
||||||
|
- name: ADMIN_LAST_NAME
|
||||||
|
value: {{ .Values.admin.lastName | quote }}
|
||||||
|
- name: ADMIN_DISPLAY_NAME
|
||||||
|
value: {{ .Values.admin.displayName | quote }}
|
||||||
|
volumeMounts:
|
||||||
|
- name: init-script
|
||||||
|
mountPath: /scripts
|
||||||
|
volumes:
|
||||||
|
- name: init-script
|
||||||
|
configMap:
|
||||||
|
name: {{ .Release.Name }}-admin-init
|
||||||
|
defaultMode: 0755
|
||||||
@ -75,6 +75,16 @@ frontend:
|
|||||||
- secretName: my-recipes-tls
|
- secretName: my-recipes-tls
|
||||||
hosts:
|
hosts:
|
||||||
- my-recipes.dvirlabs.com
|
- my-recipes.dvirlabs.com
|
||||||
|
|
||||||
|
# Admin user configuration
|
||||||
|
admin:
|
||||||
|
username: "admin"
|
||||||
|
email: "admin@myrecipes.local"
|
||||||
|
password: "admin123" # Change this password!
|
||||||
|
firstName: "Admin"
|
||||||
|
lastName: "User"
|
||||||
|
displayName: "מנהל"
|
||||||
|
|
||||||
# PostgreSQL configuration
|
# PostgreSQL configuration
|
||||||
postgres:
|
postgres:
|
||||||
name: db
|
name: db
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user