Add Docker and Coolify deployment setup
Add the container configuration, environment templates, and storage settings needed to deploy SPOTA with Docker and Coolify.
This commit is contained in:
27
.dockerignore
Normal file
27
.dockerignore
Normal file
@@ -0,0 +1,27 @@
|
||||
.git
|
||||
.gitignore
|
||||
spota_db/openfileslimit
|
||||
spota_db
|
||||
*.zip
|
||||
*.rar
|
||||
*.7z
|
||||
*.tar
|
||||
*.tar.gz
|
||||
*.tgz
|
||||
error_log
|
||||
**/error_log
|
||||
**/.DS_Store
|
||||
index_gacor.php
|
||||
index_gacor.html
|
||||
cgi-bin
|
||||
bekap
|
||||
direktori-spn
|
||||
pkm
|
||||
rekomendasi-artikel
|
||||
simpanghilir
|
||||
sisesta
|
||||
pedoman-old
|
||||
files
|
||||
files/**
|
||||
!files/.gitkeep
|
||||
img/curiga
|
||||
14
.env.coolify.example
Normal file
14
.env.coolify.example
Normal file
@@ -0,0 +1,14 @@
|
||||
APP_URL=https://spota.example.com
|
||||
|
||||
DB_USER=spota_user
|
||||
DB_PASSWORD=change_this_database_password
|
||||
DB_NAME=spota_spotadb
|
||||
DB_SPOTA=spota_spotadb
|
||||
DB_KONSULTASI=spota_konsultasi
|
||||
DB_BIO=spota_spotadb
|
||||
DB_DOSEN=spota_spotadb
|
||||
SERVICE_DB_NAME=spota_spotadb
|
||||
|
||||
MYSQL_ROOT_PASSWORD=change_this_root_password
|
||||
PHP_DISPLAY_ERRORS=0
|
||||
FILES_STORAGE_PATH=/var/www/html/files
|
||||
17
.env.example
Normal file
17
.env.example
Normal file
@@ -0,0 +1,17 @@
|
||||
APP_PORT=8080
|
||||
APP_URL=http://localhost:8080
|
||||
|
||||
DB_HOST=db
|
||||
DB_PORT=3307
|
||||
DB_USER=spota_user
|
||||
DB_PASSWORD=spota_password
|
||||
DB_NAME=spota_spotadb
|
||||
DB_SPOTA=spota_spotadb
|
||||
DB_KONSULTASI=spota_konsultasi
|
||||
DB_BIO=spota_spotadb
|
||||
DB_DOSEN=spota_spotadb
|
||||
SERVICE_DB_NAME=spota_spotadb
|
||||
|
||||
MYSQL_ROOT_PASSWORD=root_password
|
||||
PHP_DISPLAY_ERRORS=1
|
||||
FILES_STORAGE_PATH=/var/www/html/files
|
||||
62
.gitignore
vendored
Normal file
62
.gitignore
vendored
Normal file
@@ -0,0 +1,62 @@
|
||||
# Environment and secrets
|
||||
.env
|
||||
.env.*
|
||||
!.env.example
|
||||
!.env.coolify.example
|
||||
|
||||
# Dependencies / generated packages
|
||||
/vendor/
|
||||
node_modules/
|
||||
npm-debug.log*
|
||||
yarn-error.log*
|
||||
composer.lock
|
||||
package-lock.json
|
||||
|
||||
# Runtime uploads and user-generated files
|
||||
/files/
|
||||
/files/**
|
||||
!/files/.gitkeep
|
||||
/img/curiga/
|
||||
|
||||
# Logs and temporary files
|
||||
error_log
|
||||
**/error_log
|
||||
*.log
|
||||
*.tmp
|
||||
*.temp
|
||||
tmp/
|
||||
temp/
|
||||
cache/
|
||||
|
||||
# Backups, archives, and exported bundles
|
||||
*.zip
|
||||
*.rar
|
||||
*.7z
|
||||
*.tar
|
||||
*.tar.gz
|
||||
*.tgz
|
||||
*.bak
|
||||
*.backup
|
||||
*.old
|
||||
bekap/
|
||||
backup/
|
||||
backups/
|
||||
|
||||
# Known unrelated/backup project folders
|
||||
/direktori-spn/
|
||||
/pkm/
|
||||
/simpanghilir/
|
||||
/sisesta/
|
||||
/rekomendasi-artikel/
|
||||
/pedoman-old/
|
||||
|
||||
# OS/editor files
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
desktop.ini
|
||||
.idea/
|
||||
.vscode/
|
||||
|
||||
# Docker local data should be volumes, not Git content
|
||||
docker-data/
|
||||
.docker-data/
|
||||
74
DOCKER.md
Normal file
74
DOCKER.md
Normal file
@@ -0,0 +1,74 @@
|
||||
# SPOTA Docker
|
||||
|
||||
Setup ini menjalankan aplikasi legacy SPOTA dengan PHP 7.4 Apache dan MySQL 8 dalam satu `docker-compose.yml`.
|
||||
|
||||
## Jalankan Lokal
|
||||
|
||||
```powershell
|
||||
copy .env.example .env
|
||||
docker compose up -d --build
|
||||
```
|
||||
|
||||
Akses aplikasi:
|
||||
|
||||
```text
|
||||
http://localhost:8080
|
||||
http://localhost:8080/admin/login.php
|
||||
http://localhost:8080/dosen/login.php
|
||||
http://localhost:8080/mahasiswa/login.php
|
||||
```
|
||||
|
||||
## Stop
|
||||
|
||||
```powershell
|
||||
docker compose down
|
||||
```
|
||||
|
||||
## Reset Database
|
||||
|
||||
Perintah ini menghapus volume DB dan import ulang dump dari `spota_db`.
|
||||
|
||||
```powershell
|
||||
docker compose down -v
|
||||
docker compose up -d
|
||||
```
|
||||
|
||||
## Database
|
||||
|
||||
Dump diambil dari folder `spota_db` saat volume DB pertama kali dibuat.
|
||||
|
||||
Database yang di-import:
|
||||
|
||||
- `spota_spotadb`
|
||||
- `spota_konsultasi`
|
||||
- `spota_doxid`
|
||||
- `spota_rek_artikel`
|
||||
|
||||
## Volume/Data
|
||||
|
||||
Folder berikut di-mount dari host supaya data upload tidak masuk image:
|
||||
|
||||
- `./files:/var/www/html/files`
|
||||
- `./img:/var/www/html/img`
|
||||
|
||||
Opsional, upload berkas bisa dipindah ke lokasi di luar folder project dengan environment variable:
|
||||
|
||||
- `FILES_STORAGE_PATH=/absolute/path/to/files`
|
||||
|
||||
Jika `FILES_STORAGE_PATH` tidak diisi, aplikasi tetap memakai default `files/` di dalam document root.
|
||||
Folder target akan dibuat otomatis saat upload pertama.
|
||||
Jika path tersebut berada di luar `/var/www/html/files`, sesuaikan juga volume mount container ke lokasi yang sama.
|
||||
|
||||
Untuk Coolify, jadikan path ini persistent storage.
|
||||
|
||||
## Coolify
|
||||
|
||||
Sesuaikan environment berikut di Coolify:
|
||||
|
||||
- `APP_URL`
|
||||
- `DB_USER`
|
||||
- `DB_PASSWORD`
|
||||
- `MYSQL_ROOT_PASSWORD`
|
||||
- `PHP_DISPLAY_ERRORS=0` untuk production
|
||||
|
||||
Port internal app adalah `80`. Database internal memakai service name `db` pada port `3306`.
|
||||
23
Dockerfile
Normal file
23
Dockerfile
Normal file
@@ -0,0 +1,23 @@
|
||||
FROM php:7.4-apache
|
||||
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
libfreetype6-dev \
|
||||
libjpeg62-turbo-dev \
|
||||
libonig-dev \
|
||||
libpng-dev \
|
||||
libzip-dev \
|
||||
unzip \
|
||||
&& docker-php-ext-configure gd --with-freetype --with-jpeg \
|
||||
&& docker-php-ext-install -j"$(nproc)" pdo_mysql mysqli gd zip mbstring exif \
|
||||
&& a2enmod rewrite headers \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
COPY docker/php.ini /usr/local/etc/php/conf.d/spota.ini
|
||||
COPY docker/apache-vhost.conf /etc/apache2/sites-available/000-default.conf
|
||||
|
||||
WORKDIR /var/www/html
|
||||
COPY . /var/www/html
|
||||
|
||||
RUN mkdir -p /var/www/html/files /var/www/html/img /tmp/spota_sessions \
|
||||
&& chown -R www-data:www-data /var/www/html/files /var/www/html/img /tmp/spota_sessions
|
||||
31
Dockerfile.coolify
Normal file
31
Dockerfile.coolify
Normal file
@@ -0,0 +1,31 @@
|
||||
FROM php:8.2-apache-bookworm
|
||||
|
||||
RUN rm -rf /var/lib/apt/lists/* \
|
||||
&& apt-get clean \
|
||||
&& apt-get update \
|
||||
&& apt-get install -y --no-install-recommends \
|
||||
libcurl4-openssl-dev \
|
||||
libfreetype6-dev \
|
||||
libjpeg62-turbo-dev \
|
||||
libonig-dev \
|
||||
libpng-dev \
|
||||
libwebp-dev \
|
||||
libzip-dev \
|
||||
unzip \
|
||||
&& docker-php-ext-configure gd --with-freetype --with-jpeg --with-webp \
|
||||
&& docker-php-ext-install -j"$(nproc)" pdo_mysql mysqli gd curl zip mbstring exif \
|
||||
&& a2enmod rewrite headers \
|
||||
&& printf 'ServerName localhost\n' > /etc/apache2/conf-available/server-name.conf \
|
||||
&& a2enconf server-name \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
COPY docker/php.ini /usr/local/etc/php/conf.d/spota.ini
|
||||
COPY docker/apache-vhost.conf /etc/apache2/sites-available/000-default.conf
|
||||
|
||||
WORKDIR /var/www/html
|
||||
COPY . /var/www/html/
|
||||
|
||||
RUN mkdir -p /var/www/html/files /var/www/html/img /tmp/spota_sessions \
|
||||
&& chown -R www-data:www-data /var/www/html /tmp/spota_sessions
|
||||
|
||||
EXPOSE 80
|
||||
49
docker-compose.coolify.yml
Normal file
49
docker-compose.coolify.yml
Normal file
@@ -0,0 +1,49 @@
|
||||
services:
|
||||
app:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.coolify
|
||||
restart: unless-stopped
|
||||
environment:
|
||||
APP_URL: ${APP_URL}
|
||||
DB_HOST: db
|
||||
DB_USER: ${DB_USER}
|
||||
DB_PASSWORD: ${DB_PASSWORD}
|
||||
DB_NAME: ${DB_NAME:-spota_spotadb}
|
||||
DB_SPOTA: ${DB_SPOTA:-spota_spotadb}
|
||||
DB_KONSULTASI: ${DB_KONSULTASI:-spota_konsultasi}
|
||||
DB_BIO: ${DB_BIO:-spota_spotadb}
|
||||
DB_DOSEN: ${DB_DOSEN:-spota_spotadb}
|
||||
SERVICE_DB_NAME: ${SERVICE_DB_NAME:-spota_spotadb}
|
||||
PHP_DISPLAY_ERRORS: ${PHP_DISPLAY_ERRORS:-0}
|
||||
FILES_STORAGE_PATH: ${FILES_STORAGE_PATH:-/var/www/html/files}
|
||||
volumes:
|
||||
- spota_files:/var/www/html/files
|
||||
- spota_img:/var/www/html/img
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
|
||||
db:
|
||||
image: mysql:8.0
|
||||
restart: unless-stopped
|
||||
command: --default-authentication-plugin=mysql_native_password --character-set-server=latin1 --collation-server=latin1_swedish_ci --sql-mode=NO_ENGINE_SUBSTITUTION
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
|
||||
MYSQL_USER: ${DB_USER}
|
||||
MYSQL_PASSWORD: ${DB_PASSWORD}
|
||||
MYSQL_DATABASE: ${DB_NAME:-spota_spotadb}
|
||||
volumes:
|
||||
- spota_db_data:/var/lib/mysql
|
||||
- ./docker/mysql-init:/docker-entrypoint-initdb.d:ro
|
||||
- ./spota_db:/spota_db:ro
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "mysqladmin ping -h localhost -uroot -p$${MYSQL_ROOT_PASSWORD}"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 20
|
||||
|
||||
volumes:
|
||||
spota_db_data:
|
||||
spota_files:
|
||||
spota_img:
|
||||
51
docker-compose.yml
Normal file
51
docker-compose.yml
Normal file
@@ -0,0 +1,51 @@
|
||||
services:
|
||||
app:
|
||||
build: .
|
||||
container_name: spota-app
|
||||
restart: unless-stopped
|
||||
ports:
|
||||
- "${APP_PORT:-8080}:80"
|
||||
environment:
|
||||
APP_URL: ${APP_URL:-http://localhost:8080}
|
||||
DB_HOST: ${DB_HOST:-db}
|
||||
DB_USER: ${DB_USER:-spota_user}
|
||||
DB_PASSWORD: ${DB_PASSWORD:-spota_password}
|
||||
DB_NAME: ${DB_NAME:-spota_spotadb}
|
||||
DB_SPOTA: ${DB_SPOTA:-spota_spotadb}
|
||||
DB_KONSULTASI: ${DB_KONSULTASI:-spota_konsultasi}
|
||||
DB_BIO: ${DB_BIO:-spota_spotadb}
|
||||
DB_DOSEN: ${DB_DOSEN:-spota_spotadb}
|
||||
SERVICE_DB_NAME: ${SERVICE_DB_NAME:-spota_spotadb}
|
||||
PHP_DISPLAY_ERRORS: ${PHP_DISPLAY_ERRORS:-1}
|
||||
FILES_STORAGE_PATH: ${FILES_STORAGE_PATH:-/var/www/html/files}
|
||||
volumes:
|
||||
- ./files:/var/www/html/files
|
||||
- ./img:/var/www/html/img
|
||||
depends_on:
|
||||
db:
|
||||
condition: service_healthy
|
||||
|
||||
db:
|
||||
image: mysql:8.0
|
||||
container_name: spota-db
|
||||
restart: unless-stopped
|
||||
command: --default-authentication-plugin=mysql_native_password --character-set-server=latin1 --collation-server=latin1_swedish_ci
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD:-root_password}
|
||||
MYSQL_USER: ${DB_USER:-spota_user}
|
||||
MYSQL_PASSWORD: ${DB_PASSWORD:-spota_password}
|
||||
MYSQL_DATABASE: ${DB_NAME:-spota_spotadb}
|
||||
ports:
|
||||
- "${DB_PORT:-3307}:3306"
|
||||
volumes:
|
||||
- db_data:/var/lib/mysql
|
||||
- ./docker/mysql-init:/docker-entrypoint-initdb.d:ro
|
||||
- ./spota_db:/spota_db:ro
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "mysqladmin ping -h localhost -uroot -p$${MYSQL_ROOT_PASSWORD}"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 20
|
||||
|
||||
volumes:
|
||||
db_data:
|
||||
13
docker/apache-vhost.conf
Normal file
13
docker/apache-vhost.conf
Normal file
@@ -0,0 +1,13 @@
|
||||
<VirtualHost *:80>
|
||||
ServerName localhost
|
||||
DocumentRoot /var/www/html
|
||||
|
||||
<Directory /var/www/html>
|
||||
Options Indexes FollowSymLinks
|
||||
AllowOverride All
|
||||
Require all granted
|
||||
</Directory>
|
||||
|
||||
ErrorLog ${APACHE_LOG_DIR}/error.log
|
||||
CustomLog ${APACHE_LOG_DIR}/access.log combined
|
||||
</VirtualHost>
|
||||
33
docker/mysql-init/00-import-spota-databases.sh
Normal file
33
docker/mysql-init/00-import-spota-databases.sh
Normal file
@@ -0,0 +1,33 @@
|
||||
#!/bin/sh
|
||||
set -e
|
||||
|
||||
mysql_exec() {
|
||||
mysql -uroot -p"$MYSQL_ROOT_PASSWORD" "$@"
|
||||
}
|
||||
|
||||
import_database() {
|
||||
db_name="$1"
|
||||
create_file="$2"
|
||||
data_file="$3"
|
||||
|
||||
if [ -f "$create_file" ]; then
|
||||
mysql_exec < "$create_file"
|
||||
else
|
||||
mysql_exec -e "CREATE DATABASE IF NOT EXISTS \`$db_name\`;"
|
||||
fi
|
||||
|
||||
if [ -f "$data_file" ]; then
|
||||
mysql_exec "$db_name" < "$data_file"
|
||||
fi
|
||||
}
|
||||
|
||||
import_database "spota_spotadb" "/spota_db/spota_spotadb.create" "/spota_db/spota_spotadb.sql"
|
||||
import_database "spota_konsultasi" "/spota_db/spota_konsultasi.create" "/spota_db/spota_konsultasi.sql"
|
||||
import_database "spota_doxid" "/spota_db/spota_doxid.create" "/spota_db/spota_doxid.sql"
|
||||
import_database "spota_rek_artikel" "/spota_db/spota_rek_artikel.create" "/spota_db/spota_rek_artikel.sql"
|
||||
|
||||
mysql_exec -e "GRANT ALL PRIVILEGES ON \`spota_spotadb\`.* TO '$MYSQL_USER'@'%';"
|
||||
mysql_exec -e "GRANT ALL PRIVILEGES ON \`spota_konsultasi\`.* TO '$MYSQL_USER'@'%';"
|
||||
mysql_exec -e "GRANT ALL PRIVILEGES ON \`spota_doxid\`.* TO '$MYSQL_USER'@'%';"
|
||||
mysql_exec -e "GRANT ALL PRIVILEGES ON \`spota_rek_artikel\`.* TO '$MYSQL_USER'@'%';"
|
||||
mysql_exec -e "FLUSH PRIVILEGES;"
|
||||
13
docker/php.ini
Normal file
13
docker/php.ini
Normal file
@@ -0,0 +1,13 @@
|
||||
display_errors = ${PHP_DISPLAY_ERRORS}
|
||||
log_errors = On
|
||||
error_reporting = E_ALL
|
||||
max_execution_time = 120
|
||||
max_input_time = 120
|
||||
max_input_vars = 5000
|
||||
memory_limit = 512M
|
||||
post_max_size = 32M
|
||||
upload_max_filesize = 32M
|
||||
session.gc_maxlifetime = 604800
|
||||
session.save_path = "/tmp/spota_sessions"
|
||||
allow_url_fopen = On
|
||||
date.timezone = Asia/Jakarta
|
||||
Reference in New Issue
Block a user