# Overview

The server-side for an initialized, empty plugin has the following directory structure.

```bash
|- /my-plugin
  |- /src
    |- /server # Server-side code of the plugin
      |- plugin.ts # Classes of the plugin
      |- index.ts # server-side entry
  |- server.d.ts
  |- server.js
```

`plugin.ts` provides calls to various methods of the plugin lifecycle

```ts
import { InstallOptions, Plugin } from '@nocobase/server';

export class MyPlugin extends Plugin {
  afterAdd() {
    // After the plugin pm.add is registered. This is mainly used to place a listener for the app beforeLoad event
    this.app.on('beforeLoad');
  }
  beforeLoad() {
    // Custom classes or methods
    this.db.registerFieldTypes()
    this.db.registerModels()
    this.db.registerRepositories()
    this.db.registerOperators()
    // Event Listening
    this.app.on();
    this.db.on();
  }
  async load() {
    // Define collection
    this.db.collection();
    // Import collection
    this.db.import();
    this.db.addMigrations();

    // Define resource
    this.resourcer.define();
    // resource action
    this.resourcer.registerActions();

    // Register middleware
    this.resourcer.use();
    this.acl.use();
    this.app.use();

    // Customize the multilingual package
    this.app.i18n.addResources();
    // Customize command line
    this.app.command();
  }
  async install(options?: InstallOptions) {
    // Logic for installing
  }
  async afterEnable() {
    // After activation
  }
  async afterDisable() {
    // After disable
  }
  async remove() {
    // Logic for removing
  }
}

export default MyPlugin;
```