优雅永不过时,精致的看板能提升我们很多的工作效率(至少我是这么认为的)

Docker部署

创建一个独立空间

mkdir /opt/planka
cd /opt/planka

下载docker-compose.yml

curl -L https://raw.githubusercontent.com/plankanban/planka/master/docker-compose.yml -o /opt/planka/docker-compose.yml

生成一个密钥

openssl rand -hex 64

其实这步也没那么必要,也可以胡乱输入一通(doge)

编辑docker-compose.yml

vim docker-compose.yml
services:
  planka:
    image: ghcr.io/plankanban/planka:latest
    restart: on-failure
    volumes:
      - data:/app/data
      # - ./terms:/app/terms/custom
    # Optionally override this to your user/group
    # user: 1000:1000
    # tmpfs:
    #   - /app/.tmp:mode=770,uid=1000,gid=1000
    ports:
#----------------------------------------------------
# 将容器内的1337端口映射到宿主机的3000端口
      - 3000:1337
#----------------------------------------------------
    environment:
#----------------------------------------------------
# 这里的BASE_URL必须输入最后访问的URL,不然会登录失败
      - BASE_URL=http://localhost:3000
#----------------------------------------------------
      - DATABASE_URL=postgresql://postgres@postgres/planka

      # Optionally store the database password in secrets:
      # - DATABASE_URL=postgresql://postgres:$${DATABASE_PASSWORD}@postgres/planka
      # - DATABASE_PASSWORD__FILE=/run/secrets/database_password
      # And add the following to the service:
      # secrets:
      #   - database_password
#----------------------------------------------------
# 这里的SECRET_KEY就可以输入你刚才生成的密钥啦
      - SECRET_KEY=notsecretkey
#----------------------------------------------------
      # Optionally store in secrets - then SECRET_KEY should not be set
      # - SECRET_KEY__FILE=/run/secrets/secret_key

      # - LOG_LEVEL=warn

      # - TRUST_PROXY=true
      # - MAX_UPLOAD_FILE_SIZE=
      # - TOKEN_EXPIRES_IN=365 # In days

      # - STORAGE_LIMIT=
      # - ACTIVE_USERS_LIMIT=

      # related: https://github.com/knex/knex/issues/2354
      # As knex does not pass query parameters from the connection string,
      # we have to use environment variables in order to pass the desired values, e.g.
      # - PGSSLMODE=<value>

      # Configure knex to accept SSL certificates
      # - KNEX_REJECT_UNAUTHORIZED_SSL_CERTIFICATE=false

      # The default application language used as a fallback when a user's language is not set.
      # This language is also used for per-board notifications.
      # - DEFAULT_LANGUAGE=en-US

      # Do not comment out DEFAULT_ADMIN_EMAIL if you want to prevent this user from being edited/deleted
      # - DEFAULT_ADMIN_EMAIL=demo@demo.demo
      # - DEFAULT_ADMIN_PASSWORD=demo
      # Optionally store in secrets - then DEFAULT_ADMIN_PASSWORD should not be set
      # - DEFAULT_ADMIN_PASSWORD__FILE=/run/secrets/default_admin_password
      # - DEFAULT_ADMIN_NAME=Demo Demo
      # - DEFAULT_ADMIN_USERNAME=demo

      # Set to true to show more detailed authentication error messages.
      # It should not be enabled without a rate limiter for security reasons.
      # - SHOW_DETAILED_AUTH_ERRORS=false

      # All outgoing HTTP requests (SMTP, webhooks, Apprise notifications, favicon fetching, etc.)
      # will be sent through this proxy if set.
      # If commented out, an internal Squid proxy will be started inside the container,
      # which you can control via OUTGOING_BLOCKED_* and OUTGOING_ALLOWED_* below.
      # - OUTGOING_PROXY=http://proxy:3128

      # Set to true to expose the Swagger specification at /swagger.json
      # - SWAGGER_EXPOSED=false

      # - S3_ENDPOINT=
      # - S3_REGION=
      # - S3_ACCESS_KEY_ID=
      # - S3_SECRET_ACCESS_KEY=
      # Optionally store in secrets - then S3_SECRET_ACCESS_KEY should not be set
      # - S3_SECRET_ACCESS_KEY__FILE=/run/secrets/s3_secret_access_key
      # - S3_BUCKET=
      # - S3_FORCE_PATH_STYLE=true
      # - S3_REQUEST_CHECKSUM_CALCULATION=

      # - OIDC_ISSUER=
      # - OIDC_CLIENT_ID=
      # - OIDC_CLIENT_SECRET=
      # Optionally store in secrets - then OIDC_CLIENT_SECRET should not be set
      # - OIDC_CLIENT_SECRET__FILE=/run/secrets/oidc_client_secret
      # - OIDC_USE_OAUTH_CALLBACK=true
      # - OIDC_ID_TOKEN_SIGNED_RESPONSE_ALG=
      # - OIDC_USERINFO_SIGNED_RESPONSE_ALG=
      # - OIDC_SCOPES=openid email profile
      # - OIDC_RESPONSE_MODE=fragment
      # - OIDC_USE_DEFAULT_RESPONSE_MODE=true
      # - OIDC_ADMIN_ROLES=admin
      # - OIDC_PROJECT_OWNER_ROLES=project_owner
      # - OIDC_BOARD_USER_ROLES=board_user
      # - OIDC_CLAIMS_SOURCE=userinfo
      # - OIDC_EMAIL_ATTRIBUTE=email
      # - OIDC_NAME_ATTRIBUTE=name
      # - OIDC_USERNAME_ATTRIBUTE=preferred_username
      # - OIDC_ROLES_ATTRIBUTE=groups
      # - OIDC_IGNORE_USERNAME=true
      # - OIDC_IGNORE_ROLES=true
      # - OIDC_ENFORCED=true
      # - OIDC_TIMEOUT=3500
      # - OIDC_DEBUG=true

      # Email Notifications (https://nodemailer.com/smtp/)
      # These values override and disable configuration in the UI if set.
      # - SMTP_HOST=
      # - SMTP_PORT=587
      # - SMTP_NAME=
      # - SMTP_SECURE=true
      # - SMTP_TLS_REJECT_UNAUTHORIZED=false
      # - SMTP_USER=
      # - SMTP_PASSWORD=
      # Optionally store in secrets - then SMTP_PASSWORD should not be set
      # - SMTP_PASSWORD__FILE=/run/secrets/smtp_password
      # - SMTP_FROM="Demo Demo" <demo@demo.demo>

      # Using Gravatar directly exposes user IPs and hashed emails to a third party (GDPR risk).
      # Use a proxy you control for privacy, or leave commented out or empty to disable.
      # - GRAVATAR_BASE_URL=https://www.gravatar.com/avatar/

      # --------------------------------------------------------------------
      # Outgoing traffic control (internal Squid proxy)
      # --------------------------------------------------------------------

      # These IPs/hostnames will always be blocked (highest priority)
      # - OUTGOING_BLOCKED_IPS=
      # - OUTGOING_BLOCKED_HOSTS=localhost,postgres

      # Only these IPs/hostnames will be reachable
      # - OUTGOING_ALLOWED_IPS=
      # - OUTGOING_ALLOWED_HOSTS=
    depends_on:
      postgres:
        condition: service_healthy

  postgres:
    image: postgres:16-alpine
    restart: on-failure
    volumes:
      - db-data:/var/lib/postgresql/data
    environment:
      - POSTGRES_DB=planka
      - POSTGRES_HOST_AUTH_METHOD=trust
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -U postgres -d planka"]
      interval: 10s
      timeout: 5s
      retries: 5

volumes:
  data:
  db-data:

创建一个管理员

docker compose run --rm planka npm run db:create-admin-user

示例输出:

Email: 输入个邮箱(是否有效)
Password: 输入一个密码
Name: 输入账号名
Username (optional): 昵称(可选)

启动服务

docker compose up -d