# Development Services # Tools and services for development work # Service Access URLs: # - GitLab: https://gitlab.${DOMAIN} # - pgAdmin: https://pgadmin.${DOMAIN} # - Jupyter: https://jupyter.${DOMAIN} services: # GitLab CE - Self-hosted Git repository manager # Access at: https://gitlab.${DOMAIN} # Note: Requires significant resources (4GB+ RAM recommended) gitlab: image: gitlab/gitlab-ce:latest container_name: gitlab restart: unless-stopped networks: - homelab-network - traefik-network volumes: - ./config/gitlab/config:/etc/gitlab - gitlab-logs:/var/log/gitlab - gitlab-data:/var/opt/gitlab environment: GITLAB_OMNIBUS_CONFIG: | external_url 'https://gitlab.${DOMAIN}' gitlab_rails['gitlab_shell_ssh_port'] = 2222 gitlab_rails['time_zone'] = '${TZ:-America/New_York}' shm_size: '256m' deploy: resources: limits: memory: 4G reservations: memory: 2G labels: - "homelab.category=development" - "homelab.description=Self-hosted Git repository manager" - "traefik.enable=true" - "traefik.http.routers.gitlab.rule=Host(`gitlab.${DOMAIN}`)" - "traefik.http.routers.gitlab.entrypoints=websecure" - "traefik.http.routers.gitlab.tls.certresolver=letsencrypt" - "traefik.http.routers.gitlab.middlewares=authelia@docker" - "traefik.http.services.gitlab.loadbalancer.server.port=80" # PostgreSQL - Database for development # Access at: localhost:5432 from other containers postgres: image: postgres:16.1-alpine container_name: postgres-dev restart: unless-stopped networks: - database-network - homelab-network ports: - "5432:5432" volumes: - postgres-data:/var/lib/postgresql/data - ./config/postgres/init:/docker-entrypoint-initdb.d environment: - POSTGRES_USER=${POSTGRES_USER:-postgres} - POSTGRES_PASSWORD=${POSTGRES_PASSWORD:-changeme} - POSTGRES_DB=${POSTGRES_DB:-homelab} - PGDATA=/var/lib/postgresql/data/pgdata labels: - "homelab.category=development" - "homelab.description=PostgreSQL database for development" # Redis - In-memory data store # Access at: localhost:6379 from other containers redis: image: redis:7.2.3-alpine container_name: redis-dev restart: unless-stopped networks: - database-network - homelab-network ports: - "6379:6379" volumes: - redis-data:/data - ./config/redis/redis.conf:/usr/local/etc/redis/redis.conf command: redis-server /usr/local/etc/redis/redis.conf --appendonly yes labels: - "homelab.category=development" - "homelab.description=Redis in-memory data store" # pgAdmin - PostgreSQL management UI # Access at: https://pgadmin.${DOMAIN} pgadmin: image: dpage/pgadmin4:latest container_name: pgadmin restart: unless-stopped networks: - database-network - homelab-network - traefik-network volumes: - pgadmin-data:/var/lib/pgadmin environment: - PGADMIN_DEFAULT_EMAIL=${PGADMIN_EMAIL:-admin@example.com} - PGADMIN_DEFAULT_PASSWORD=${PGADMIN_PASSWORD:-changeme} - PGADMIN_CONFIG_SERVER_MODE=False depends_on: - postgres labels: - "homelab.category=development" - "homelab.description=PostgreSQL administration UI" - "traefik.enable=true" - "traefik.http.routers.pgadmin.rule=Host(`pgadmin.${DOMAIN}`)" - "traefik.http.routers.pgadmin.entrypoints=websecure" - "traefik.http.routers.pgadmin.tls.certresolver=letsencrypt" - "traefik.http.routers.pgadmin.middlewares=authelia@docker" - "traefik.http.services.pgadmin.loadbalancer.server.port=80" # Jupyter Lab - Interactive computing notebooks # Access at: https://jupyter.${DOMAIN} # Token displayed in logs on first start jupyter: image: jupyter/scipy-notebook:latest container_name: jupyter restart: unless-stopped networks: - homelab-network - traefik-network volumes: - ./config/jupyter:/home/jovyan/work environment: - JUPYTER_ENABLE_LAB=yes - GRANT_SUDO=yes user: root command: start-notebook.sh --NotebookApp.token='${JUPYTER_TOKEN:-changeme}' # Uncomment for GPU support (NVIDIA, requires nvidia-container-toolkit) # runtime: nvidia # devices: # - /dev/nvidia0:/dev/nvidia0 # - /dev/nvidiactl:/dev/nvidiactl # Add these to environment above: # - NVIDIA_VISIBLE_DEVICES=all # - NVIDIA_DRIVER_CAPABILITIES=compute,utility labels: - "homelab.category=development" - "homelab.description=Jupyter Lab for data science and ML" - "traefik.enable=true" - "traefik.http.routers.jupyter.rule=Host(`jupyter.${DOMAIN}`)" - "traefik.http.routers.jupyter.entrypoints=websecure" - "traefik.http.routers.jupyter.tls.certresolver=letsencrypt" - "traefik.http.routers.jupyter.middlewares=authelia@docker" - "traefik.http.services.jupyter.loadbalancer.server.port=8888" volumes: gitlab-logs: driver: local gitlab-data: driver: local postgres-data: driver: local redis-data: driver: local pgadmin-data: driver: local networks: database-network: driver: bridge homelab-network: external: true traefik-network: external: true