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