services: open-webui: image: ghcr.io/open-webui/open-webui:main container_name: open-webui restart: always ports: - "127.0.0.1:3000:8080" environment: - ENABLE_OAUTH_SIGNUP=True - OAUTH_REDIRECT_URI=https://chat.ai-personalserv.com/oauth/oidc/callback - OAUTH_CLIENT_ID=263505435253-bd1901r56phgpp4vtm9d6uug70u1mk2a.apps.googleusercontent.com - OAUTH_CLIENT_SECRET=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 - OPENID_PROVIDER_URL=https://accounts.google.com/.well-known/openid-configuration - OAUTH_PROVIDER_NAME=Google - OAUTH_SCOPES=openid email profile - YT_SERVICE_URL=http://127.0.0.1:5001 - WEBUI_SECRET_KEY=Yanu1004! extra_hosts: - "host.docker.internal:host-gateway" volumes: - open-webui:/app/backend/data - /root/my-plugins:/app/backend/plugins memos: image: neosmemo/memos:stable container_name: memos init: true restart: always ports: - "127.0.0.1:5230:5230" volumes: - ~/.memos/:/var/opt/memos n8n: image: docker.n8n.io/n8nio/n8n container_name: n8n restart: always ports: - "127.0.0.1:5678:5678" environment: N8N_TRUST_PROXY: "true" N8N_LOG_LEVEL: debug OPENAI_API_KEY: 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 HTTP_PROXY: HTTPS_PROXY: ALL_PROXY: NO_PROXY: localhost,127.0.0.1,api.openai.com NODE_OPTIONS: --dns-result-order=ipv4first GHOST_URL: https://blog.ai-personalserv.com GHOST_ADMIN_API_KEY: 683691c668955b0001cc24b9:5d49499550e1e74f7160470752c3c683031fe879c5f9877eb6f3012bc47ed25b volumes: - n8n_data:/home/node/.n8n netdata: image: netdata/netdata:latest container_name: netdata ports: - "19999:19999" restart: unless-stopped cap_add: - SYS_PTRACE security_opt: - apparmor=unconfined volumes: - netdata_lib:/var/lib/netdata - netdata_cache:/var/cache/netdata - /proc:/host/proc:ro - /sys:/host/sys:ro - /etc/os-release:/host/etc/os-release:ro - /var/run/docker.sock:/var/run/docker.sock:ro environment: - DOCKER_HOST=unix:///var/run/docker.sock db: image: postgres:16 container_name: sonardb restart: always environment: - POSTGRES_USER=sonar - POSTGRES_PASSWORD=sonar - POSTGRES_DB=sonar volumes: - postgresql:/var/lib/postgresql - postgresql_data:/var/lib/postgresql/data sonarqube: image: sonarqube:community container_name: sonarqube depends_on: - db restart: always environment: - SONAR_JDBC_URL=jdbc:postgresql://db:5432/sonar - SONAR_JDBC_USERNAME=sonar - SONAR_JDBC_PASSWORD=sonar ports: - "9000:9000" volumes: - sonarqube_data:/opt/sonarqube/data - sonarqube_extensions:/opt/sonarqube/extensions - sonarqube_logs:/opt/sonarqube/logs jellyfin: image: jellyfin/jellyfin:latest container_name: jellyfin restart: always ports: - "8096:8096" volumes: - jellyfin_config:/config - jellyfin_cache:/cache - /root/media:/media # 실제 미디어 경로로 변경 tika: image: apache/tika:latest container_name: tika restart: always ports: - "9998:9998" # Tika는 stateless 서비스이므로 별도 볼륨 필요 없음 jupyter: image: jupyter/minimal-notebook container_name: jupyter user: root restart: always ports: - "0.0.0.0:8888:8888" volumes: - jupyter_data:/home/jovyan/work - /root/workspace:/home/jovyan/work - /root/.jupyterconfig:/home/jovyan/.jupyter environment: - JUPYTER_TOKEN=MyStongToken! # 필요에 따라 더 많은 환경변수 설정 가능 command: > start-notebook.sh --NotebookApp.allow_origin='https://jupyter.ai-personalserv.com' --NotebookApp.allow_credentials=True --NotebookApp.allow_remote_access=True watchtower: image: containrrr/watchtower:latest container_name: watchtower restart: always environment: - WATCHTOWER_POLL_INTERVAL=60 - WATCHTOWER_CLEANUP=true volumes: - /var/run/docker.sock:/var/run/docker.sock # command를 완전히 지우거나, 다음처럼 주시면 # 모든 컨테이너 최신태그로 자동 갱신됩니다. command: --interval 60 --cleanup # 2. 블로그 (Ghost) blog: image: ghost:5-alpine container_name: blog ports: - "127.0.0.1:2368:2368" environment: url: https://blog.ai-personalserv.com database__client: mysql database__connection__host: db-mysql database__connection__user: ghost database__connection__password: ghost_db_pass database__connection__database: ghost mail__from: yeonwoo.kim03@gmail.com mail__options__auth__pass: sdoemyomrefpkjsg mail__options__auth__user: yeonwoo.kim03@gmail.com mail__options__service: gmail mail__transport: SMTP depends_on: - db-mysql restart: always volumes: - ghost-data:/var/lib/ghost/content links: - db-mysql # 5. 데이터베이스 인프라 db-mysql: image: mysql:latest ports: - "3306:3306" container_name: mysql environment: TZ: Asia/Seoul MYSQL_ROOT_PASSWORD: root_db_pass MYSQL_DATABASE: mysql_db MYSQL_USER: mysql_user MYSQL_PASSWORD: mysql_password volumes: - mysql_data:/var/lib/mysql restart: unless-stopped #홈페이지 flame: image: pawelmalak/flame container_name: flame volumes: - /data/flame/data/:/app/data - /var/run/docker.sock:/var/run/docker.sock # optional but required for Docker integration ports: - 5005:5005 #secrets: # - password # optional but required for (1) environment: PASSWORD: Yanu1004! #- PASSWORD_FILE=/run/secrets/password # optional but required for (1) restart: unless-stopped filebrowser: image: filebrowser/filebrowser:latest container_name: filebrowser volumes: - ./files:/srv - ./filebrowser.db:/database/filebrowser.db # 필요하면 설정 파일도 마운트 # - ./settings.json:/config/settings.json environment: - PUID=1000 - PGID=1000 ports: - "8900:89" command: ["--port", "89"] volumes: open-webui: external: true n8n_data: external: true netdata_lib: external: true netdata_cache: external: true sonarqube_data: external: true sonarqube_extensions: external: true sonarqube_logs: external: true postgresql: external: true jellyfin_config: external: true jellyfin_cache: external: true jupyter_data: external: true mysql_data: external: true postgresql_data: external: true ghost_data: external: true