Add Kubernetes job for database initialization
This commit is contained in:
@@ -0,0 +1,242 @@
|
|||||||
|
apiVersion: batch/v1
|
||||||
|
kind: Job
|
||||||
|
metadata:
|
||||||
|
name: init-database
|
||||||
|
namespace: lahuasca
|
||||||
|
spec:
|
||||||
|
template:
|
||||||
|
spec:
|
||||||
|
containers:
|
||||||
|
- name: init-db
|
||||||
|
image: postgres:15
|
||||||
|
command:
|
||||||
|
- sh
|
||||||
|
- -c
|
||||||
|
- |
|
||||||
|
apk add --no-cache curl
|
||||||
|
# Wait for postgres to be ready
|
||||||
|
until pg_isready -h postgres.lahuasca.svc.cluster.local -U lahuasca; do
|
||||||
|
echo "Waiting for postgres..."
|
||||||
|
sleep 2
|
||||||
|
done
|
||||||
|
|
||||||
|
# Create tables and seed data
|
||||||
|
psql -h postgres.lahuasca.svc.cluster.local -U lahuasca -d lahuasca << 'EOF'
|
||||||
|
-- Create all tables
|
||||||
|
CREATE TABLE IF NOT EXISTS users (
|
||||||
|
id SERIAL PRIMARY KEY,
|
||||||
|
username VARCHAR(50) UNIQUE NOT NULL,
|
||||||
|
password_hash VARCHAR(255) NOT NULL,
|
||||||
|
role VARCHAR(20) NOT NULL CHECK (role IN ('admin', 'user')),
|
||||||
|
comments_disabled BOOLEAN DEFAULT FALSE,
|
||||||
|
first_name VARCHAR(100),
|
||||||
|
last_name VARCHAR(100),
|
||||||
|
created_at TIMESTAMP DEFAULT NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS images (
|
||||||
|
id SERIAL PRIMARY KEY,
|
||||||
|
filename VARCHAR(255) NOT NULL,
|
||||||
|
data TEXT NOT NULL,
|
||||||
|
category VARCHAR(100) DEFAULT 'other',
|
||||||
|
room_id INTEGER REFERENCES rooms(id) ON DELETE SET NULL,
|
||||||
|
location_target VARCHAR(100) DEFAULT 'gallery',
|
||||||
|
uploaded_at TIMESTAMP DEFAULT NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS reservations (
|
||||||
|
id SERIAL PRIMARY KEY,
|
||||||
|
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
|
||||||
|
date DATE NOT NULL,
|
||||||
|
time TIME NOT NULL,
|
||||||
|
guests INTEGER NOT NULL,
|
||||||
|
table_name VARCHAR(100) NOT NULL,
|
||||||
|
created_at TIMESTAMP DEFAULT NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS coupons (
|
||||||
|
id SERIAL PRIMARY KEY,
|
||||||
|
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
|
||||||
|
code VARCHAR(50) NOT NULL,
|
||||||
|
discount VARCHAR(255) NOT NULL,
|
||||||
|
created_at TIMESTAMP DEFAULT NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS offers (
|
||||||
|
id SERIAL PRIMARY KEY,
|
||||||
|
title VARCHAR(255) NOT NULL,
|
||||||
|
description TEXT NOT NULL,
|
||||||
|
active BOOLEAN DEFAULT TRUE,
|
||||||
|
sort_order INTEGER DEFAULT 0,
|
||||||
|
created_at TIMESTAMP DEFAULT NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS benefits (
|
||||||
|
id SERIAL PRIMARY KEY,
|
||||||
|
text VARCHAR(500) NOT NULL,
|
||||||
|
created_at TIMESTAMP DEFAULT NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS config (
|
||||||
|
key VARCHAR(100) PRIMARY KEY,
|
||||||
|
value TEXT NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS rooms (
|
||||||
|
id SERIAL PRIMARY KEY,
|
||||||
|
name VARCHAR(255) NOT NULL,
|
||||||
|
description TEXT NOT NULL,
|
||||||
|
price NUMERIC(10,2) NOT NULL,
|
||||||
|
photos TEXT[] DEFAULT '{}',
|
||||||
|
featured_photo VARCHAR(500),
|
||||||
|
active BOOLEAN DEFAULT TRUE,
|
||||||
|
sort_order INTEGER DEFAULT 0,
|
||||||
|
created_at TIMESTAMP DEFAULT NOW(),
|
||||||
|
updated_at TIMESTAMP DEFAULT NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS menu_items (
|
||||||
|
id SERIAL PRIMARY KEY,
|
||||||
|
category VARCHAR(100) NOT NULL,
|
||||||
|
name VARCHAR(255) NOT NULL,
|
||||||
|
description TEXT,
|
||||||
|
price NUMERIC(10,2) NOT NULL,
|
||||||
|
is_daily_special BOOLEAN DEFAULT FALSE,
|
||||||
|
active BOOLEAN DEFAULT TRUE,
|
||||||
|
sort_order INTEGER DEFAULT 0,
|
||||||
|
created_at TIMESTAMP DEFAULT NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS places (
|
||||||
|
id SERIAL PRIMARY KEY,
|
||||||
|
name VARCHAR(255) NOT NULL,
|
||||||
|
description TEXT NOT NULL,
|
||||||
|
photos TEXT[] DEFAULT '{}',
|
||||||
|
featured_photo VARCHAR(500),
|
||||||
|
distance_km NUMERIC(8,2),
|
||||||
|
visit_time VARCHAR(100),
|
||||||
|
suggestion TEXT,
|
||||||
|
active BOOLEAN DEFAULT TRUE,
|
||||||
|
sort_order INTEGER DEFAULT 0,
|
||||||
|
created_at TIMESTAMP DEFAULT NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS reviews (
|
||||||
|
id SERIAL PRIMARY KEY,
|
||||||
|
author_name VARCHAR(255) NOT NULL,
|
||||||
|
rating INTEGER NOT NULL CHECK (rating BETWEEN 1 AND 5),
|
||||||
|
text TEXT NOT NULL,
|
||||||
|
approved BOOLEAN DEFAULT FALSE,
|
||||||
|
created_at TIMESTAMP DEFAULT NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS slides (
|
||||||
|
id SERIAL PRIMARY KEY,
|
||||||
|
title VARCHAR(255),
|
||||||
|
subtitle TEXT,
|
||||||
|
image_id INTEGER REFERENCES images(id) ON DELETE SET NULL,
|
||||||
|
image_url VARCHAR(500),
|
||||||
|
active BOOLEAN DEFAULT TRUE,
|
||||||
|
sort_order INTEGER DEFAULT 0,
|
||||||
|
created_at TIMESTAMP DEFAULT NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS room_comments (
|
||||||
|
id SERIAL PRIMARY KEY,
|
||||||
|
room_id INTEGER REFERENCES rooms(id) ON DELETE CASCADE,
|
||||||
|
photo_url VARCHAR(500),
|
||||||
|
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
|
||||||
|
first_name VARCHAR(100) NOT NULL,
|
||||||
|
last_initial VARCHAR(10),
|
||||||
|
text TEXT NOT NULL,
|
||||||
|
created_at TIMESTAMP DEFAULT NOW(),
|
||||||
|
deleted_by_admin BOOLEAN DEFAULT FALSE
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS social_events (
|
||||||
|
id SERIAL PRIMARY KEY,
|
||||||
|
name VARCHAR(255) NOT NULL,
|
||||||
|
description TEXT,
|
||||||
|
price VARCHAR(50),
|
||||||
|
date DATE,
|
||||||
|
photos TEXT[] DEFAULT '{}',
|
||||||
|
featured_photo VARCHAR(500),
|
||||||
|
active BOOLEAN DEFAULT TRUE,
|
||||||
|
sort_order INTEGER DEFAULT 0,
|
||||||
|
created_at TIMESTAMP DEFAULT NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS social_event_reservations (
|
||||||
|
id SERIAL PRIMARY KEY,
|
||||||
|
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
|
||||||
|
social_event_id INTEGER REFERENCES social_events(id) ON DELETE CASCADE,
|
||||||
|
guests INTEGER NOT NULL,
|
||||||
|
notes TEXT,
|
||||||
|
status VARCHAR(20) DEFAULT 'pending' CHECK (status IN ('pending', 'confirmed', 'cancelled')),
|
||||||
|
created_at TIMESTAMP DEFAULT NOW(),
|
||||||
|
UNIQUE(user_id, social_event_id)
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS calendar_events (
|
||||||
|
id SERIAL PRIMARY KEY,
|
||||||
|
date DATE NOT NULL UNIQUE,
|
||||||
|
title VARCHAR(255) NOT NULL,
|
||||||
|
type VARCHAR(100) NOT NULL,
|
||||||
|
description TEXT,
|
||||||
|
color VARCHAR(20) NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS user_sessions (
|
||||||
|
id SERIAL PRIMARY KEY,
|
||||||
|
user_id INTEGER REFERENCES users(id) ON DELETE CASCADE,
|
||||||
|
token TEXT NOT NULL,
|
||||||
|
created_at TIMESTAMP DEFAULT NOW()
|
||||||
|
);
|
||||||
|
|
||||||
|
-- Add missing columns if they don't exist
|
||||||
|
ALTER TABLE rooms ADD COLUMN IF NOT EXISTS featured_photo VARCHAR(500);
|
||||||
|
ALTER TABLE users ADD COLUMN IF NOT EXISTS comments_disabled BOOLEAN DEFAULT FALSE;
|
||||||
|
ALTER TABLE users ADD COLUMN IF NOT EXISTS first_name VARCHAR(100);
|
||||||
|
ALTER TABLE users ADD COLUMN IF NOT EXISTS last_name VARCHAR(100);
|
||||||
|
|
||||||
|
-- Insert initial data
|
||||||
|
-- Default admin user (password: admin)
|
||||||
|
INSERT INTO users (username, password_hash, role) VALUES
|
||||||
|
('admin', '$2a$10$8K1p/a0dhrxiowP.dnkgNORTWgdEDHn5L2/xjpEWuC.QQv4rKO9jO', 'admin')
|
||||||
|
ON CONFLICT (username) DO NOTHING;
|
||||||
|
|
||||||
|
-- Default config values
|
||||||
|
INSERT INTO config (key, value) VALUES
|
||||||
|
('wifi_password', 'LaHuascaGuest2026'),
|
||||||
|
('tagline', 'Hotel · Restaurant · Andean Highlands')
|
||||||
|
ON CONFLICT (key) DO NOTHING;
|
||||||
|
|
||||||
|
-- Sample offers
|
||||||
|
INSERT INTO offers (title, description, active, sort_order) VALUES
|
||||||
|
('Summer Wine Weekend', 'Complimentary wine tasting with every two-night stay.', true, 1),
|
||||||
|
('Sunset Dinner', 'Three-course menu on the terrace every Friday.', true, 2)
|
||||||
|
ON CONFLICT DO NOTHING;
|
||||||
|
|
||||||
|
-- Sample benefits
|
||||||
|
INSERT INTO benefits (text) VALUES
|
||||||
|
('Priority booking for peak weekends'),
|
||||||
|
('Late checkout on availability'),
|
||||||
|
('Free welcome cocktail'),
|
||||||
|
('Member-only events and tastings')
|
||||||
|
ON CONFLICT DO NOTHING;
|
||||||
|
EOF
|
||||||
|
|
||||||
|
echo "Database initialization completed!"
|
||||||
|
env:
|
||||||
|
- name: PGPASSWORD
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: la-huasca-db-secrets
|
||||||
|
key: POSTGRES_PASSWORD
|
||||||
|
- name: POSTGRES_USER
|
||||||
|
valueFrom:
|
||||||
|
secretKeyRef:
|
||||||
|
name: la-huasca-db-secrets
|
||||||
|
key: POSTGRES_USER
|
||||||
|
restartPolicy: Never
|
||||||
|
backoffLimit: 4
|
||||||
Reference in New Issue
Block a user