Instalasi Docker
Prasyarat
- Sudah menginstal Docker dan Docker Compose
- Pastikan layanan Docker sedang berjalan
1. Buat docker-compose.yml Baru
# Buat folder bernama my-project (bisa nama lain) untuk menyimpan file sistem yang dibuat NocoBase
mkdir my-project && cd my-project
# Buat file docker-compose.yml kosong
vi docker-compose.yml
2. Konfigurasi docker-compose.yml
Pilih versi NocoBase (Perbandingan Versi) dan tipe database, salin konfigurasi yang sesuai ke docker-compose.yml.
Penjelasan Konfigurasi
- Pemilihan Image:
latest latest-full beta beta-full alpha alpha-full 1.7.14 1.7.14-full
- Untuk lingkungan produksi disarankan menggunakan versi numerik tetap untuk menghindari upgrade otomatis yang tidak disengaja. Lihat semua versi
- Image Aliyun:
registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:latest-full
- Image Docker Hub:
nocobase/nocobase:latest-full
- Image full mencakup PostgreSQL 16/17 client, MySQL 8.0 client, Oracle 19.25 client yang dibutuhkan Plugin manajemen backup dan migrasi, serta LibreOffice yang dibutuhkan untuk template printing (PDF)
- Jika ingin membangun image sendiri, dapat merujuk ke Dockerfile (versi ringan) dan Dockerfile-full (versi lengkap) resmi
- Modifikasi
APP_KEY: Ganti your-secret-key dengan string acak, digunakan untuk mengenkripsi Token pengguna dan informasi sensitif lainnya
- Menggunakan Database yang Sudah Ada: Jika sudah memiliki layanan database, modifikasi
DB_HOST ke alamat server database, dan hapus atau komentari konfigurasi layanan database (seperti layanan postgres, mysql, mariadb)
- Pemetaan Port: Default memetakan port 80 container ke port 13000 host, dapat dimodifikasi sesuai kebutuhan
networks:
nocobase:
driver: bridge
services:
app:
image: registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:latest-full
restart: always
networks:
- nocobase
depends_on:
- postgres
environment:
# Kunci aplikasi, digunakan untuk menghasilkan Token pengguna, dll.
# Jika APP_KEY dimodifikasi, Token lama akan menjadi tidak valid
# Bisa berupa string acak apa saja, dan pastikan tidak bocor ke pihak luar
- APP_KEY=your-secret-key
# Tipe database, mendukung postgres, mysql, mariadb
- DB_DIALECT=postgres
# Host database, dapat diganti dengan IP server database yang sudah ada
- DB_HOST=postgres
# Database port
- DB_PORT=5432
# Nama database
- DB_DATABASE=nocobase
# Pengguna database
- DB_USER=nocobase
# Password database
- DB_PASSWORD=nocobase
# Zona waktu
- TZ=Asia/Shanghai
volumes:
- ./storage:/app/nocobase/storage
ports:
- '13000:80'
# init: true
# Jika menggunakan layanan database yang sudah ada, postgres tidak perlu dijalankan
postgres:
image: registry.cn-shanghai.aliyuncs.com/nocobase/postgres:16
restart: always
command: postgres -c wal_level=logical
environment:
POSTGRES_USER: nocobase
POSTGRES_DB: nocobase
POSTGRES_PASSWORD: nocobase
volumes:
- ./storage/db/postgres:/var/lib/postgresql/data
networks:
- nocobase
networks:
nocobase:
driver: bridge
services:
app:
image: registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:latest-full
restart: always
networks:
- nocobase
depends_on:
- mysql
environment:
# Kunci aplikasi, digunakan untuk menghasilkan Token pengguna, dll.
# Jika APP_KEY dimodifikasi, Token lama akan menjadi tidak valid
# Bisa berupa string acak apa saja, dan pastikan tidak bocor ke pihak luar
- APP_KEY=your-secret-key
# Tipe database, mendukung postgres, mysql, mariadb
- DB_DIALECT=mysql
# Host database, dapat diganti dengan IP server database yang sudah ada
- DB_HOST=mysql
# Database port
- DB_PORT=3306
# Nama database
- DB_DATABASE=nocobase
# Pengguna database
- DB_USER=root
# Password database
- DB_PASSWORD=nocobase
# Apakah nama tabel dan field database dikonversi ke gaya snake case
- DB_UNDERSCORED=true
# Zona waktu
- TZ=Asia/Shanghai
volumes:
- ./storage:/app/nocobase/storage
ports:
- '13000:80'
# init: true
# Jika menggunakan layanan database yang sudah ada, mysql tidak perlu dijalankan
mysql:
image: registry.cn-shanghai.aliyuncs.com/nocobase/mysql:8
environment:
MYSQL_DATABASE: nocobase
MYSQL_USER: nocobase
MYSQL_PASSWORD: nocobase
MYSQL_ROOT_PASSWORD: nocobase
restart: always
volumes:
- ./storage/db/mysql:/var/lib/mysql
networks:
- nocobase
networks:
nocobase:
driver: bridge
services:
app:
image: registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:latest-full
restart: always
networks:
- nocobase
depends_on:
- mariadb
environment:
# Kunci aplikasi, digunakan untuk menghasilkan Token pengguna, dll.
# Jika APP_KEY dimodifikasi, Token lama akan menjadi tidak valid
# Bisa berupa string acak apa saja, dan pastikan tidak bocor ke pihak luar
- APP_KEY=your-secret-key
# Tipe database, mendukung postgres, mysql, mariadb
- DB_DIALECT=mariadb
# Host database, dapat diganti dengan IP server database yang sudah ada
- DB_HOST=mariadb
# Database port
- DB_PORT=3306
# Nama database
- DB_DATABASE=nocobase
# Pengguna database
- DB_USER=root
# Password database
- DB_PASSWORD=nocobase
# Apakah nama tabel dan field database dikonversi ke gaya snake case
- DB_UNDERSCORED=true
# Zona waktu
- TZ=Asia/Shanghai
volumes:
- ./storage:/app/nocobase/storage
ports:
- '13000:80'
# init: true
# Jika menggunakan layanan database yang sudah ada, mariadb tidak perlu dijalankan
mariadb:
image: registry.cn-shanghai.aliyuncs.com/nocobase/mariadb:11
environment:
MYSQL_DATABASE: nocobase
MYSQL_USER: nocobase
MYSQL_PASSWORD: nocobase
MYSQL_ROOT_PASSWORD: nocobase
restart: always
volumes:
- ./storage/db/mariadb:/var/lib/mysql
networks:
- nocobase
networks:
nocobase:
driver: bridge
services:
app:
image: registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:beta-full
restart: always
networks:
- nocobase
depends_on:
- postgres
environment:
# Kunci aplikasi, digunakan untuk menghasilkan Token pengguna, dll.
# Jika APP_KEY dimodifikasi, Token lama akan menjadi tidak valid
# Bisa berupa string acak apa saja, dan pastikan tidak bocor ke pihak luar
- APP_KEY=your-secret-key
# Tipe database, mendukung postgres, mysql, mariadb
- DB_DIALECT=postgres
# Host database, dapat diganti dengan IP server database yang sudah ada
- DB_HOST=postgres
# Database port
- DB_PORT=5432
# Nama database
- DB_DATABASE=nocobase
# Pengguna database
- DB_USER=nocobase
# Password database
- DB_PASSWORD=nocobase
# Zona waktu
- TZ=Asia/Shanghai
volumes:
- ./storage:/app/nocobase/storage
ports:
- '13000:80'
# init: true
# Jika menggunakan layanan database yang sudah ada, postgres tidak perlu dijalankan
postgres:
image: registry.cn-shanghai.aliyuncs.com/nocobase/postgres:16
restart: always
command: postgres -c wal_level=logical
environment:
POSTGRES_USER: nocobase
POSTGRES_DB: nocobase
POSTGRES_PASSWORD: nocobase
volumes:
- ./storage/db/postgres:/var/lib/postgresql/data
networks:
- nocobase
networks:
nocobase:
driver: bridge
services:
app:
image: registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:beta-full
restart: always
networks:
- nocobase
depends_on:
- mysql
environment:
# Kunci aplikasi, digunakan untuk menghasilkan Token pengguna, dll.
# Jika APP_KEY dimodifikasi, Token lama akan menjadi tidak valid
# Bisa berupa string acak apa saja, dan pastikan tidak bocor ke pihak luar
- APP_KEY=your-secret-key
# Tipe database, mendukung postgres, mysql, mariadb
- DB_DIALECT=mysql
# Host database, dapat diganti dengan IP server database yang sudah ada
- DB_HOST=mysql
# Database port
- DB_PORT=3306
# Nama database
- DB_DATABASE=nocobase
# Pengguna database
- DB_USER=root
# Password database
- DB_PASSWORD=nocobase
# Apakah nama tabel dan field database dikonversi ke gaya snake case
- DB_UNDERSCORED=true
# Zona waktu
- TZ=Asia/Shanghai
volumes:
- ./storage:/app/nocobase/storage
ports:
- '13000:80'
# init: true
# Jika menggunakan layanan database yang sudah ada, mysql tidak perlu dijalankan
mysql:
image: registry.cn-shanghai.aliyuncs.com/nocobase/mysql:8
environment:
MYSQL_DATABASE: nocobase
MYSQL_USER: nocobase
MYSQL_PASSWORD: nocobase
MYSQL_ROOT_PASSWORD: nocobase
restart: always
volumes:
- ./storage/db/mysql:/var/lib/mysql
networks:
- nocobase
networks:
nocobase:
driver: bridge
services:
app:
image: registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:beta-full
restart: always
networks:
- nocobase
depends_on:
- mariadb
environment:
# Kunci aplikasi, digunakan untuk menghasilkan Token pengguna, dll.
# Jika APP_KEY dimodifikasi, Token lama akan menjadi tidak valid
# Bisa berupa string acak apa saja, dan pastikan tidak bocor ke pihak luar
- APP_KEY=your-secret-key
# Tipe database, mendukung postgres, mysql, mariadb
- DB_DIALECT=mariadb
# Host database, dapat diganti dengan IP server database yang sudah ada
- DB_HOST=mariadb
# Database port
- DB_PORT=3306
# Nama database
- DB_DATABASE=nocobase
# Pengguna database
- DB_USER=root
# Password database
- DB_PASSWORD=nocobase
# Apakah nama tabel dan field database dikonversi ke gaya snake case
- DB_UNDERSCORED=true
# Zona waktu
- TZ=Asia/Shanghai
volumes:
- ./storage:/app/nocobase/storage
ports:
- '13000:80'
# init: true
# Jika menggunakan layanan database yang sudah ada, mariadb tidak perlu dijalankan
mariadb:
image: registry.cn-shanghai.aliyuncs.com/nocobase/mariadb:11
environment:
MYSQL_DATABASE: nocobase
MYSQL_USER: nocobase
MYSQL_PASSWORD: nocobase
MYSQL_ROOT_PASSWORD: nocobase
restart: always
volumes:
- ./storage/db/mariadb:/var/lib/mysql
networks:
- nocobase
networks:
nocobase:
driver: bridge
services:
app:
image: registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:alpha-full
restart: always
networks:
- nocobase
depends_on:
- postgres
environment:
# Kunci aplikasi, digunakan untuk menghasilkan Token pengguna, dll.
# Jika APP_KEY dimodifikasi, Token lama akan menjadi tidak valid
# Bisa berupa string acak apa saja, dan pastikan tidak bocor ke pihak luar
- APP_KEY=your-secret-key
# Tipe database, mendukung postgres, mysql, mariadb
- DB_DIALECT=postgres
# Host database, dapat diganti dengan IP server database yang sudah ada
- DB_HOST=postgres
# Database port
- DB_PORT=5432
# Nama database
- DB_DATABASE=nocobase
# Pengguna database
- DB_USER=nocobase
# Password database
- DB_PASSWORD=nocobase
# Zona waktu
- TZ=Asia/Shanghai
volumes:
- ./storage:/app/nocobase/storage
ports:
- '13000:80'
# init: true
# Jika menggunakan layanan database yang sudah ada, postgres tidak perlu dijalankan
postgres:
image: registry.cn-shanghai.aliyuncs.com/nocobase/postgres:16
restart: always
command: postgres -c wal_level=logical
environment:
POSTGRES_USER: nocobase
POSTGRES_DB: nocobase
POSTGRES_PASSWORD: nocobase
volumes:
- ./storage/db/postgres:/var/lib/postgresql/data
networks:
- nocobase
networks:
nocobase:
driver: bridge
services:
app:
image: registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:alpha-full
restart: always
networks:
- nocobase
depends_on:
- mysql
environment:
# Kunci aplikasi, digunakan untuk menghasilkan Token pengguna, dll.
# Jika APP_KEY dimodifikasi, Token lama akan menjadi tidak valid
# Bisa berupa string acak apa saja, dan pastikan tidak bocor ke pihak luar
- APP_KEY=your-secret-key
# Tipe database, mendukung postgres, mysql, mariadb
- DB_DIALECT=mysql
# Host database, dapat diganti dengan IP server database yang sudah ada
- DB_HOST=mysql
# Database port
- DB_PORT=3306
# Nama database
- DB_DATABASE=nocobase
# Pengguna database
- DB_USER=root
# Password database
- DB_PASSWORD=nocobase
# Apakah nama tabel dan field database dikonversi ke gaya snake case
- DB_UNDERSCORED=true
# Zona waktu
- TZ=Asia/Shanghai
volumes:
- ./storage:/app/nocobase/storage
ports:
- '13000:80'
# init: true
# Jika menggunakan layanan database yang sudah ada, mysql tidak perlu dijalankan
mysql:
image: registry.cn-shanghai.aliyuncs.com/nocobase/mysql:8
environment:
MYSQL_DATABASE: nocobase
MYSQL_USER: nocobase
MYSQL_PASSWORD: nocobase
MYSQL_ROOT_PASSWORD: nocobase
restart: always
volumes:
- ./storage/db/mysql:/var/lib/mysql
networks:
- nocobase
networks:
nocobase:
driver: bridge
services:
app:
image: registry.cn-shanghai.aliyuncs.com/nocobase/nocobase:alpha-full
restart: always
networks:
- nocobase
depends_on:
- mariadb
environment:
# Kunci aplikasi, digunakan untuk menghasilkan Token pengguna, dll.
# Jika APP_KEY dimodifikasi, Token lama akan menjadi tidak valid
# Bisa berupa string acak apa saja, dan pastikan tidak bocor ke pihak luar
- APP_KEY=your-secret-key
# Tipe database, mendukung postgres, mysql, mariadb
- DB_DIALECT=mariadb
# Host database, dapat diganti dengan IP server database yang sudah ada
- DB_HOST=mariadb
# Database port
- DB_PORT=3306
# Nama database
- DB_DATABASE=nocobase
# Pengguna database
- DB_USER=root
# Password database
- DB_PASSWORD=nocobase
# Apakah nama tabel dan field database dikonversi ke gaya snake case
- DB_UNDERSCORED=true
# Zona waktu
- TZ=Asia/Shanghai
volumes:
- ./storage:/app/nocobase/storage
ports:
- '13000:80'
# init: true
# Jika menggunakan layanan database yang sudah ada, mariadb tidak perlu dijalankan
mariadb:
image: registry.cn-shanghai.aliyuncs.com/nocobase/mariadb:11
environment:
MYSQL_DATABASE: nocobase
MYSQL_USER: nocobase
MYSQL_PASSWORD: nocobase
MYSQL_ROOT_PASSWORD: nocobase
restart: always
volumes:
- ./storage/db/mariadb:/var/lib/mysql
networks:
- nocobase
3. Instal dan Jalankan NocoBase
# Tarik image terbaru
docker compose pull
# Jalankan di background (saat pertama kali dijalankan, instalasi akan dilakukan otomatis)
docker compose up -d
# Lihat log instalasi dan runtime
docker compose logs -f app
app-postgres-app-1 | nginx started
app-postgres-app-1 | yarn run v1.22.15
app-postgres-app-1 | $ cross-env DOTENV_CONFIG_PATH=.env node -r dotenv/config packages/app/server/lib/index.js install -s
app-postgres-app-1 | Done in 2.72s.
app-postgres-app-1 | yarn run v1.22.15
app-postgres-app-1 | $ pm2-runtime start --node-args="-r dotenv/config" packages/app/server/lib/index.js -- start
app-postgres-app-1 | 2022-04-28T15:45:38: PM2 log: Launching in no daemon mode
app-postgres-app-1 | 2022-04-28T15:45:38: PM2 log: App [index:0] starting in -fork mode-
app-postgres-app-1 | 2022-04-28T15:45:38: PM2 log: App [index:0] online
app-postgres-app-1 | 🚀 NocoBase server running at: http://localhost:13000/
4. Login ke NocoBase
Buka http://localhost:13000 di browser, akun dan password awal adalah admin@nocobase.com dan admin123.
Tips Keamanan Akun
Setelah login pertama kali, segera ubah password default untuk memastikan keamanan sistem.
5. Deployment produksi
Jika Anda menggunakan image dengan Nginx bawaan, biasanya lebih baik tidak mengekspos 13000 langsung ke internet publik. Cara yang lebih umum adalah membiarkan port kontainer hanya tersedia di host, lalu menggunakan Nginx di host untuk menangani domain, HTTPS, dan reverse proxy.
Proxy path root dengan Nginx
Konfigurasi berikut mem-proxy permintaan domain ke http://127.0.0.1:13000/:
server {
listen 80;
server_name your_domain.com; # Ganti your_domain.com dengan domain Anda
location / {
proxy_pass http://127.0.0.1:13000/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $upstream_x_forwarded_proto;
proxy_set_header Host $final_host;
proxy_set_header Referer $http_referer;
proxy_set_header User-Agent $http_user_agent;
add_header Cache-Control "no-cache, no-store" always;
proxy_cache_bypass $http_upgrade;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
proxy_buffering off;
}
}
Jika Anda juga ingin mengaktifkan HTTPS, konfigurasikan 443 dan sertifikat di Nginx host. Kontainer NocoBase tidak perlu menangani sertifikat secara terpisah.
Blok location / pada konfigurasi root path ini juga meneruskan /api/, /ws, dan /files/. Jika Anda memisahkan aset statis dari rute aplikasi, pastikan /files/ tetap diteruskan ke NocoBase dan tidak diperlakukan sebagai direktori statis.
Deployment subpath
Jika Anda ingin men-deploy aplikasi di subpath, misalnya https://your_domain.com/nocobase/, konfigurasikan dulu variabel lingkungan APP_PUBLIC_PATH:
services:
app:
image: nocobase/nocobase:latest
environment:
+ - APP_PUBLIC_PATH=/nocobase/
Pertahankan / di awal dan akhir path. Setelah dikonfigurasi, URL aplikasi menjadi http://127.0.0.1:13000/nocobase/.
Lalu konfigurasikan Nginx host dengan proxy subpath yang sama:
server {
listen 80;
server_name your_domain.com; # Ganti your_domain.com dengan domain Anda
location /nocobase/ {
proxy_pass http://127.0.0.1:13000/nocobase/;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $upstream_x_forwarded_proto;
proxy_set_header Host $final_host;
proxy_set_header Referer $http_referer;
proxy_set_header User-Agent $http_user_agent;
add_header Cache-Control "no-cache, no-store" always;
proxy_cache_bypass $http_upgrade;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
proxy_buffering off;
}
# Pertahankan kompatibilitas dengan URL akses file di root.
location ^~ /files/ {
proxy_pass http://127.0.0.1:13000;
proxy_http_version 1.1;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $upstream_x_forwarded_proto;
proxy_set_header Host $final_host;
proxy_set_header Referer $http_referer;
proxy_set_header User-Agent $http_user_agent;
add_header Cache-Control "no-cache, no-store" always;
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
}
}
Perhatikan hal berikut:
APP_PUBLIC_PATH dan path di proxy_pass harus konsisten. Jika salah satu sisi tidak menyertakan /nocobase/, aset statis dan routing biasanya tidak akan berjalan dengan benar
/nocobase/files/ diteruskan oleh location /nocobase/; rute kompatibilitas /files/ di root harus diteruskan ke NocoBase secara terpisah
Opsi lain
Jika Anda tidak ingin menggunakan Nginx bawaan, Anda juga bisa melihat dua konfigurasi proxy terpisah ini: