Compare commits

..

No commits in common. "edeb3ba932c6fa9bac7262c6711287c0e8f25f76" and "0bbbba4a11c3f8d0e0f700870abb5555e8ecfcfd" have entirely different histories.

360 changed files with 489 additions and 2517 deletions

View File

@ -1,32 +1,74 @@
# Dependencies # ========================================
node_modules/ # Docker Ignore File
vendor/ # ========================================
# Build artifacts # Git
/public/build .git
/public/hot .gitignore
/public/storage .gitattributes
/storage/*.key
# Environment files # Documentation
.env README.md
.env.backup CHANGELOG.md
.env.production Documentation/
*.md
# IDE files # Tests
tests/
phpunit.xml
.phpunit.cache
.phpunit.result.cache
# IDE & Editors
.vscode/ .vscode/
.idea/ .idea/
.fleet/
.nova/
.zed/
*.swp *.swp
*.swo *.swo
*~
# OS generated files
.DS_Store .DS_Store
.DS_Store?
._*
.Spotlight-V100
.Trashes
ehthumbs.db
Thumbs.db Thumbs.db
.phpactor.json
# Docker files (tidak perlu di-copy ke image)
Dockerfile
docker-compose*.yml
.dockerignore
# Environment files (akan di-set via environment variables)
.env
.env.*
!.env.example
# Dependencies (akan di-install via composer & npm)
/vendor/
/node_modules/
# Build artifacts (akan di-build di stage terpisah)
/public/hot
/public/build
# Storage & Cache (akan di-mount sebagai volume)
/storage/*.key
/storage/logs/*
/storage/framework/cache/*
/storage/framework/sessions/*
/storage/framework/views/*
/storage/pail
# Generated files
/public/storage
/bootstrap/cache/*
# Local development files
Homestead.json
Homestead.yaml
auth.json
.vagrant
.phpstorm.meta.php
_ide_helper.php
# Logs # Logs
*.log *.log
@ -34,86 +76,7 @@ npm-debug.log*
yarn-debug.log* yarn-debug.log*
yarn-error.log* yarn-error.log*
# Runtime data # OS Files
pids .DS_Store
*.pid Thumbs.db
*.seed desktop.ini
*.pid.lock
# Coverage directory used by tools like istanbul
coverage/
# nyc test coverage
.nyc_output
# Dependency directories
jspm_packages/
# Optional npm cache directory
.npm
# Optional REPL history
.node_repl_history
# Output of 'npm pack'
*.tgz
# Yarn Integrity file
.yarn-integrity
# dotenv environment variables file
.env.test
# parcel-bundler cache (https://parceljs.org/)
.cache
.parcel-cache
# next.js build output
.next
# nuxt.js build output
.nuxt
# vuepress build output
.vuepress/dist
# Serverless directories
.serverless
# FuseBox cache
.fusebox/
# DynamoDB Local files
.dynamodb/
# TernJS port file
.tern-port
# Laravel specific
/bootstrap/cache/*.php
/storage/app/*
!/storage/app/.gitignore
/storage/framework/cache/*
!/storage/framework/cache/.gitignore
/storage/framework/sessions/*
!/storage/framework/sessions/.gitignore
/storage/framework/testing/*
!/storage/framework/testing/.gitignore
/storage/framework/views/*
!/storage/framework/views/.gitignore
/storage/logs/*
!/storage/logs/.gitignore
# Testing
/coverage
/.phpunit.result.cache
/phpunit.xml
# Backup files
*.bak
*.backup
*.sql
# Documentation
README.md
Documentation/

5
.gitignore vendored
View File

@ -24,5 +24,6 @@ Homestead.yaml
Thumbs.db Thumbs.db
# Docker - Database Backups (exclude backups from git) # Docker - Database Backups (exclude backups from git)
/docker /docker/mysql/backups/*.sql
deploy-kasir.sh /docker/mysql/backups/*.sql.gz
!/docker/mysql/backups/README.md

View File

@ -1,57 +1,91 @@
# Use PHP 8.2 with Apache # ========================================
FROM php:8.2-apache # Stage 1: Build Frontend Assets (Vue.js)
# ========================================
FROM node:20-alpine as node_builder
WORKDIR /app
# Copy package files untuk caching layer
COPY package*.json ./
# Install dependencies
RUN npm ci --legacy-peer-deps
# Copy seluruh source code
COPY . .
# Build production assets
RUN npm run build
# ========================================
# Stage 2: Laravel Application
# ========================================
FROM php:8.3-fpm-alpine
# Install system dependencies dan PHP extensions
RUN apk update && apk add --no-cache \
git \
unzip \
libzip-dev \
libpng-dev \
oniguruma-dev \
libxml2-dev \
curl \
mysql-client \
autoconf \
g++ \
make \
&& docker-php-ext-install \
pdo_mysql \
zip \
gd \
mbstring \
exif \
pcntl \
bcmath \
&& pecl install redis \
&& docker-php-ext-enable redis \
&& apk del autoconf g++ make \
&& rm -rf /var/cache/apk/* /tmp/*
# Install Composer
COPY --from=composer:2 /usr/bin/composer /usr/bin/composer
# Set working directory # Set working directory
WORKDIR /var/www/html WORKDIR /var/www/html
# Install system dependencies # Copy composer files untuk caching layer
RUN apt-get update && apt-get install -y \ COPY composer.json composer.lock ./
git \
curl \
libpng-dev \
libonig-dev \
libxml2-dev \
libzip-dev \
zip \
unzip \
nodejs \
npm \
&& docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd zip
# Install Redis extension
RUN pecl install redis && docker-php-ext-enable redis
# Install Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer
# Enable Apache mod_rewrite
RUN a2enmod rewrite
# Copy Apache configuration
COPY docker/apache/000-default.conf /etc/apache2/sites-available/000-default.conf
# Copy application files
COPY . /var/www/html
# Set proper permissions
RUN chown -R www-data:www-data /var/www/html \
&& chmod -R 755 /var/www/html/storage \
&& chmod -R 755 /var/www/html/bootstrap/cache
# Install PHP dependencies # Install PHP dependencies
RUN composer install --no-dev --optimize-autoloader RUN composer install --no-dev --no-scripts --no-autoloader --prefer-dist
# Install Node.js dependencies and build assets # Copy application source code
RUN npm install && npm run build COPY . .
# Create .env file if it doesn't exist # Copy hasil build Vue dari stage 1
RUN if [ ! -f .env ]; then cp .env.example .env; fi COPY --from=node_builder /app/public/build /var/www/html/public/build
# Generate application key # Generate autoload files dengan optimasi
RUN php artisan key:generate RUN composer dump-autoload --optimize --classmap-authoritative
# Expose port 80 # Create required directories dan set permissions
EXPOSE 80 RUN mkdir -p \
storage/framework/cache \
storage/framework/sessions \
storage/framework/views \
storage/logs \
bootstrap/cache \
&& chown -R www-data:www-data \
/var/www/html/storage \
/var/www/html/bootstrap/cache \
&& chmod -R 775 \
/var/www/html/storage \
/var/www/html/bootstrap/cache
# Start Apache # Switch ke user non-root untuk keamanan
CMD ["apache2-foreground"] USER www-data
EXPOSE 9000
CMD ["php-fpm"]

View File

@ -18,7 +18,7 @@ class AuthController extends Controller
]); ]);
// cari user berdasarkan nama // cari user berdasarkan nama
$user = User::whereRaw('BINARY nama = ?', [$request->nama])->first(); $user = User::where('nama', $request->nama)->first();
if (!$user || !Hash::check($request->password, $user->password)) { if (!$user || !Hash::check($request->password, $user->password)) {
return response()->json([ return response()->json([

View File

@ -3,7 +3,6 @@
namespace App\Http\Controllers; namespace App\Http\Controllers;
use App\Models\Item; use App\Models\Item;
use App\Models\Nampan;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class ItemController extends Controller class ItemController extends Controller
@ -67,20 +66,13 @@ class ItemController extends Controller
{ {
$validated = $request->validate([ $validated = $request->validate([
'id_produk' => 'required|exists:produks,id', 'id_produk' => 'required|exists:produks,id',
'id_nampan' => 'required', 'id_nampan' => 'nullable|exists:nampans,id'
],[ ],[
'id_produk' => 'Id produk tidak valid.', 'id_produk' => 'Id produk tidak valid.',
'id_nampan' => 'Id nampan tidak valid' 'id_nampan' => 'Id nampan tidak valid'
]); ]);
if ($validated['id_nampan'] == 0) {
$item = Item::findOrFail($id)->update([
'id_produk' => $validated['id_produk'],
'id_nampan' => null
]);
} else {
$item = Item::findOrFail($id)->update($validated); $item = Item::findOrFail($id)->update($validated);
}
return response()->json([ return response()->json([
'message' => 'Item berhasil diubah', 'message' => 'Item berhasil diubah',

0
bootstrap/cache/.gitignore vendored Executable file → Normal file
View File

View File

@ -1,79 +1,177 @@
version: '3.8' version: '3.9'
services: services:
app: # ========================================
# Laravel PHP-FPM Application
# ========================================
laravel:
build: build:
context: . context: .
dockerfile: Dockerfile dockerfile: Dockerfile
container_name: kasir-app container_name: abbauf_kasir_app
restart: unless-stopped restart: unless-stopped
working_dir: /var/www/html working_dir: /var/www/html
volumes: volumes:
- ./:/var/www/html # Mount storage untuk uploads dan logs (persistent)
- ./docker/mysql/backups:/var/www/html/docker/mysql/backups - ./storage/app/public:/var/www/html/storage/app/public
ports: # Mount public build assets (read-only)
- "8000:80" - ./public/build:/var/www/html/public/build:ro
environment: environment:
- APP_ENV=local # Application
- APP_DEBUG=true APP_NAME: ${APP_NAME:-Abbauf-Kasir}
- DB_HOST=mysql APP_ENV: ${APP_ENV:-production}
- DB_PORT=3306 APP_KEY: ${APP_KEY}
- DB_DATABASE=kasir_db APP_DEBUG: ${APP_DEBUG:-false}
- DB_USERNAME=kasir_user APP_URL: ${APP_URL:-http://localhost}
- DB_PASSWORD=kasir_password
- REDIS_HOST=redis
- REDIS_PORT=6379
depends_on:
- mysql
- redis
# Database
DB_CONNECTION: mysql
DB_HOST: mysql
DB_PORT: 3306
DB_DATABASE: ${DB_DATABASE:-kasir_db}
DB_USERNAME: ${DB_USERNAME:-kasir_user}
DB_PASSWORD: ${DB_PASSWORD}
# Cache & Session
CACHE_STORE: redis
SESSION_DRIVER: redis
REDIS_HOST: redis
REDIS_PORT: 6379
# Queue
QUEUE_CONNECTION: redis
depends_on:
mysql: mysql:
image: mysql:5.7 condition: service_healthy
container_name: kasir-mysql redis:
condition: service_started
networks:
- kasir_network
# healthcheck:
# test: ["CMD", "php-fpm", "-t"]
# interval: 30s
# timeout: 10s
# retries: 3
# ========================================
# Nginx Web Server
# ========================================
nginx:
image: nginx:alpine
container_name: abbauf_kasir_nginx
restart: unless-stopped
ports:
- "81:80"
volumes:
# Nginx configuration
- ./nginx.conf:/etc/nginx/conf.d/default.conf
# Laravel public directory (untuk static assets)
- ./public:/var/www/html/public
# Storage symlink untuk file uploads
- ./storage/app/public:/var/www/html/public/storage
depends_on:
- laravel
networks:
- kasir_network
# healthcheck:
# test: ["CMD", "wget", "--quiet", "--tries=1", "--spider", "http://localhost/"]
# interval: 30s
# timeout: 10s
# retries: 3
# ========================================
# MySQL Database
# ========================================
mysql:
# image: mysql:8.4
image: mariadb:10.6
container_name: abbauf_kasir_db
restart: unless-stopped restart: unless-stopped
environment: environment:
MYSQL_DATABASE: kasir_db MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root_secret_password}
MYSQL_ROOT_PASSWORD: kasir_password MYSQL_DATABASE: ${DB_DATABASE:-kasir_db}
MYSQL_USER: kasir_user MYSQL_USER: ${DB_USERNAME:-kasir_user}
MYSQL_PASSWORD: kasir_password MYSQL_PASSWORD: ${DB_PASSWORD}
volumes: MYSQL_CHARACTER_SET_SERVER: utf8mb4
- ./docker/mysql/mysql_data:/var/lib/mysql MYSQL_COLLATION_SERVER: utf8mb4_unicode_ci
- ./docker/mysql/backups:/backups
ports: ports:
- "3308:3306" - "3308:3306"
volumes:
- mysql_data:/var/lib/mysql
# Optional: backup folder
- ./docker/mysql/backups:/backups
networks:
- kasir_network
healthcheck:
test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-u", "root", "-p${MYSQL_ROOT_PASSWORD:-root_secret_password}"]
interval: 10s
timeout: 5s
retries: 5
# command: --default-authentication-plugin=mysql_native_password
# ========================================
# Redis Cache & Session Store
# ========================================
redis: redis:
image: redis:7-alpine image: redis:7-alpine
container_name: kasir-redis container_name: abbauf_kasir_redis
restart: unless-stopped restart: unless-stopped
ports: ports:
- "6380:6379" - "6380:6379"
volumes: volumes:
- ./docker/redis/redis_data:/data - redis_data:/data
# phpmyadmin:
# image: phpmyadmin/phpmyadmin
# container_name: kasir-phpmyadmin
# restart: unless-stopped
# environment:
# PMA_HOST: mysql
# PMA_PORT: 3306
# PMA_USER: ${DB_USERNAME}
# PMA_PASSWORD: ${DB_PASSWORD}
# ports:
# - "8080:80"
# depends_on:
# - mysql
# networks:
# - kasir-network
# volumes:
# mysql_data:
# driver: local
# redis_data:
# driver: local
networks: networks:
default: - kasir_network
external: true # healthcheck:
name: kasir_kasir_network # test: ["CMD", "redis-cli", "ping"]
# interval: 10s
# timeout: 5s
# retries: 3
command: redis-server --appendonly yes
# ========================================
# Queue Worker (Optional - untuk background jobs)
# ========================================
queue:
build:
context: .
dockerfile: Dockerfile
container_name: abbauf_kasir_queue
restart: unless-stopped
working_dir: /var/www/html
volumes:
- ./storage:/var/www/html/storage
environment:
APP_ENV: ${APP_ENV:-production}
APP_KEY: ${APP_KEY}
DB_CONNECTION: mysql
DB_HOST: mysql
DB_PORT: 3306
DB_DATABASE: ${DB_DATABASE:-kasir_db}
DB_USERNAME: ${DB_USERNAME:-kasir_user}
DB_PASSWORD: ${DB_PASSWORD}
REDIS_HOST: redis
QUEUE_CONNECTION: redis
depends_on:
- laravel
- redis
- mysql
networks:
- kasir_network
command: php artisan queue:work --tries=3 --timeout=90
# ========================================
# Networks
# ========================================
networks:
kasir_network:
driver: bridge
# ========================================
# Persistent Volumes
# ========================================
volumes:
mysql_data:
driver: local
redis_data:
driver: local

View File

@ -1,12 +0,0 @@
<VirtualHost *:80>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html/public
<Directory /var/www/html/public>
AllowOverride All
Require all granted
</Directory>
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

View File

@ -1,2 +0,0 @@
[auto]
server-uuid=79710a58-aeaa-11f0-a626-0242ac150002

Binary file not shown.

Binary file not shown.

View File

@ -1,135 +0,0 @@
10,69
10,29
10,93
10,2
10,3
11,13
11,4
11,8
11,17
11,15
11,16
11,7
11,2
11,3
9,5
9,2
9,3
8,7
8,5
8,2
8,3
0,457
12,2
12,1
12,3
20,2
20,1
20,3
19,2
19,1
19,3
18,1
18,3
14,1
11,28
11,27
11,26
14,5
11,25
11,24
14,3
13,1
11,23
11,22
13,3
11,21
11,20
11,1
11,19
10,303
10,302
10,301
10,300
10,299
10,298
10,297
10,296
2,2
10,295
2,1
10,294
10,293
10,292
2,3
10,291
10,290
10,289
10,288
10,287
10,286
10,285
10,284
10,283
10,282
10,281
10,280
10,279
10,278
10,277
10,276
10,275
10,274
10,273
10,272
10,271
10,270
10,269
10,268
10,267
10,266
10,265
10,264
10,263
10,262
10,261
10,260
10,259
10,258
10,257
10,256
10,255
10,254
10,253
10,252
10,251
10,250
10,249
10,248
10,247
10,246
10,245
10,244
10,243
10,242
10,241
10,240
10,239
10,238
10,237
10,236
10,235
10,234
10,233
10,232
10,231
10,230
10,229
10,228
10,227
10,226
10,225
10,224
10,223
10,222
10,221

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -1,2 +0,0 @@
default-character-set=latin1
default-collation=latin1_swedish_ci

View File

@ -1 +0,0 @@
/var/run/mysqld/mysqld.sock

View File

@ -1 +0,0 @@
ÿlocalhost performance_schema mysql.session ÿlocalhost sys mysql.sys ÿ% kasir\_db kasir_user 

Binary file not shown.

Binary file not shown.

View File

@ -1,2 +0,0 @@
default-character-set=latin1
default-collation=latin1_swedish_ci

Some files were not shown because too many files have changed in this diff Show More