# \[PAID\] Install Discourse in Subfolder on Ubuntu Server

**URL:** https://meta.discourse.org/t/paid-install-discourse-in-subfolder-on-ubuntu-server/185274
**Category:** Marketplace
**Created:** [April 2, 2021, 4:53pm UTC](https://meta.discourse.org/t/paid-install-discourse-in-subfolder-on-ubuntu-server/185274 "2021-04-02T16:53:48Z")
**Posts on this page:** 2
**Page:** 1

<div class="post-metadata">

### Author: ![ahmed\_khan1](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/ahmed_khan1/32/201517_2.png) [@ahmed\_khan1](https://meta.discourse.org/u/ahmed_khan1)
#### Post date: [April 2, 2021, 4:53pm UTC](https://meta.discourse.org/t/paid-install-discourse-in-subfolder-on-ubuntu-server/185274/1 "2021-04-02T16:53:48Z")

</div>

We have [this](https://talkwithstranger.com/) website. we need to set up a subfolder discourse docker forum on ubuntu. We want to serve discourse on [https://talkwithstranger.com/ask](https://talkwithstranger.com/ask) without using CDN.

I have tried to set it up by following [this tutorial](https://meta.discourse.org/t/subfolder-support-with-docker/30507https://meta.discourse.org/t/subfolder-support-with-docker/30507) but I am having these problems

1. Avatars disappears after 2 or 3 rebuilds
2. Images uploaded on topics are giving 404 after some rebuilds

you have to fix bugs on [this test domain](http://privitevps.ga/ask) so I can install and fix those same bugs on my live website 95% of work is done you just have to fix some bugs

### My app.yml

```
## Subfolder support with Docker https://meta.discourse.org/t/subfolder-support-with-docker/30507

## discourse-terraform Docker configuration template

##

## After making changes to this file, you MUST rebuild for any changes

## to take effect in your live Discourse instance:

##

## /var/discourse/launcher rebuild app

##

## this is the all-in-one, standalone Discourse Docker container template

# You may add rate limiting to by commenting out the ratelimited template.

# Out of the box it allows 12 reqs a second per ip, and 100 per minute per ip

# This is configurable by amending the params in this file

templates:

  - "templates/postgres.template.yml"

  - "templates/redis.template.yml"

  - "templates/web.template.yml"

  - "templates/sshd.template.yml"

## which TCP/IP ports should this container expose?

expose:

  - "1357:80" #change this port to port where you want run discourse # fwd host port 80 to container port 80 (http)

  #- "2222:22" # fwd host port 2222 to container port 22 (ssh)

params:

  db_default_text_search_config: "pg_catalog.english"

  ## Set db_shared_buffers to 1/3 of the memory you wish to allocate to postgres

  ## on 1GB install set to 128MB on a 4GB instance you may raise to 1GB

  db_shared_buffers: "512MB"

  #

  ## Which Git revision should this container use? (default: tests-passed)

  #version: tests-passed

env:

  LANG: en_US.UTF-8

  ## TODO: How many concurrent web requests are supported?

  ## With 2GB we recommend 3-4 workers, with 1GB only 2

  UNICORN_WORKERS: 3

  ##

  ## TODO: List of comma delimited emails that will be made admin and developer

  ## on initial signup example 'user1@example.com, user2@example.com'

  DISCOURSE_DEVELOPER_EMAILS: "ahmeds.works@gmail.com" #change these emails to site admins emails

  ##

  ## TODO: The domain name this Discourse instance will respond to

  DISCOURSE_RELATIVE_URL_ROOT: /ask 

  DISCOURSE_HOSTNAME: "privitevps.ga" #change this domain to you website domain

  ##

  ## TODO: The mailserver this Discourse instance will use

  # change smtp setting to your own smtp setting

  DISCOURSE_SMTP_ADDRESS: smtp.example.com

  DISCOURSE_SMTP_PORT: 587

  DISCOURSE_SMTP_USER_NAME: example@example.com

  DISCOURSE_SMTP_PASSWORD: example_password

##

  ## The CDN address for this Discourse instance (configured to pull)

  #DISCOURSE_CDN_URL: //discourse-cdn.example.com

## These containers are stateless, all data is stored in /shared

volumes:

  - volume:

      host: /var/discourse/shared/standalone

      guest: /shared

  - volume:

      host: /var/discourse/shared/standalone/log/var-log

      guest: /var/log

## The docker manager plugin allows you to one-click upgrade Discouse

## http://discourse.example.com/admin/docker

hooks:

  after_code:

    - exec:

        cd: $home/plugins

        cmd:

          - mkdir -p plugins

          - git clone https://github.com/discourse/docker_manager.git

          - git clone https://github.com/discourse/discourse-voting.git

## Remember, this is YAML syntax - you can only have one block with a name

run:

    - exec:

        cd: $home

        cmd:

          - rm -fr public/assets

          - sudo -E -u discourse bundle exec rake assets:precompile

          - mkdir -p public/ask

          - cd public/ask && ln -s ../uploads && ln -s ../backups

          - rm public/uploads

          - rm public/backups

    - replace:

       global: true

       filename: /etc/nginx/conf.d/discourse.conf

       from: proxy_pass http://discourse;

       to: |

          rewrite ^/(.*)$ /ask/$1 break;

          proxy_pass http://discourse;

    - replace:

       filename: /etc/nginx/conf.d/discourse.conf

       from: etag off;

       to: |

          etag off;

          location /ask {

             rewrite ^/ask/?(.*)$ /$1;

          }

    - replace:

         filename: /etc/nginx/conf.d/discourse.conf

         from: $proxy_add_x_forwarded_for

         to: $http_fastly_client_ip

         global: true

    - exec: echo "End of custom commands"

    - exec: awk -F\# '{print $1;}' ~/.ssh/authorized_keys | awk 'BEGIN { print "Authorized SSH keys for this container:"; } NF>=2 {print $NF;}'

```

### nginx config

```
location /ask {
    proxy_pass http://localhost:1357;
    proxy_read_timeout 90;
    proxy_redirect http://localhost:1357 https://privitevps.ga;
}

```

### Discourse error log

```
    /var/www/discourse/app/models/report.rb:267:in `rescue in find'

    /var/www/discourse/app/models/report.rb:234:in `find'

    /var/www/discourse/app/controllers/admin/reports_controller.rb:42:in `block (2 levels) in bulk'

    actionpack-6.0.3.5/lib/action_controller/metal/strong_parameters.rb:345:in `block in each_pair'

    actionpack-6.0.3.5/lib/action_controller/metal/strong_parameters.rb:344:in `each_pair'

    actionpack-6.0.3.5/lib/action_controller/metal/strong_parameters.rb:344:in `each_pair'

    /var/www/discourse/app/controllers/admin/reports_controller.rb:31:in `block in bulk'

    /var/www/discourse/lib/hijack.rb:56:in `instance_eval'

    /var/www/discourse/lib/hijack.rb:56:in `block in hijack'

    /var/www/discourse/lib/scheduler/defer.rb:94:in `block in do_work'

    rails_multisite-2.5.0/lib/rails_multisite/connection_management.rb:76:in `with_connection'

    /var/www/discourse/lib/scheduler/defer.rb:89:in `do_work'

    /var/www/discourse/lib/scheduler/defer.rb:79:in `block (2 levels) in start_thread'

```

### PostgreSQL log

```
2021-04-01 18:33:04.209 UTC [51] LOG: starting PostgreSQL 13.2 (Debian 13.2-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
2021-04-01 18:33:04.210 UTC [51] LOG: listening on IPv4 address "0.0.0.0", port 5432
2021-04-01 18:33:04.211 UTC [51] LOG: listening on IPv6 address "::", port 5432
2021-04-01 18:33:04.211 UTC [51] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2021-04-01 18:33:04.223 UTC [73] LOG: database system was shut down at 2021-04-01 18:32:19 UTC
2021-04-01 18:33:04.230 UTC [51] LOG: database system is ready to accept connections
2021-04-01 18:44:16.543 UTC [1155] discourse@discourse LOG: provided user name (discourse) and authenticated user name (root) do not match
2021-04-01 18:44:16.544 UTC [1155] discourse@discourse FATAL: Peer authentication failed for user "discourse"
2021-04-01 18:44:16.544 UTC [1155] discourse@discourse DETAIL: Connection matched pg_hba.conf line 94: "local all all peer"
2021-04-02 03:33:33.893 UTC [36640] discourse@discourse LOG: duration: 141.998 ms statement: COPY public.stylesheet_cache (id, target, digest, content, created_at, updated_at, theme_id, source_map) TO stdout;
2021-04-02 17:49:50.676 UTC [92100] discourse@discourse LOG: duration: 156.461 ms statement: DO $$DECLARE row record;
        BEGIN
          -- create <destination> schema if it does not exists already
          -- NOTE: DROP & CREATE SCHEMA is easier, but we don't want to drop the public schema
          -- otherwise extensions (like hstore & pg_trgm) won't work anymore...
          CREATE SCHEMA IF NOT EXISTS backup;
          -- move all <source> tables to <destination> schema
          FOR row IN SELECT tablename FROM pg_tables WHERE schemaname = 'public' AND tableowner = 'discourse'
          LOOP
            EXECUTE 'DROP TABLE IF EXISTS backup.' || quote_ident(row.tablename) || ' CASCADE;';
            EXECUTE 'ALTER TABLE public.' || quote_ident(row.tablename) || ' SET SCHEMA backup;';
          END LOOP;
          -- move all <source> views to <destination> schema
          FOR row IN SELECT viewname FROM pg_views WHERE schemaname = 'public' AND viewowner = 'discourse'
          LOOP
            EXECUTE 'DROP VIEW IF EXISTS backup.' || quote_ident(row.viewname) || ' CASCADE;';
            EXECUTE 'ALTER VIEW public.' || quote_ident(row.viewname) || ' SET SCHEMA backup;';
          END LOOP;
        END$$;

2021-04-02 17:49:52.092 UTC [92128] discourse@discourse LOG: duration: 114.918 ms statement: COPY public.scheduler_stats (id, name, hostname, pid, duration_ms, live_slots_start, live_slots_finish, started_at, success, error) FROM stdin;
2021-04-02 17:49:53.398 UTC [92128] discourse@discourse LOG: duration: 1266.208 ms statement: COPY public.stylesheet_cache (id, target, digest, content, created_at, updated_at, theme_id, source_map) FROM stdin;
2021-04-02 17:51:24.451 UTC [51] LOG: received smart shutdown request
2021-04-02 17:51:26.828 UTC [51] LOG: background worker "logical replication launcher" (PID 79) exited with exit code 1
2021-04-02 17:51:26.836 UTC [74] LOG: shutting down
2021-04-02 17:51:26.948 UTC [51] LOG: database system is shut down
2021-04-02 18:00:56.877 UTC [52] LOG: starting PostgreSQL 13.2 (Debian 13.2-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
2021-04-02 18:00:56.879 UTC [52] LOG: listening on IPv4 address "0.0.0.0", port 5432
2021-04-02 18:00:56.879 UTC [52] LOG: listening on IPv6 address "::", port 5432
2021-04-02 18:00:56.880 UTC [52] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2021-04-02 18:00:56.893 UTC [73] LOG: database system was shut down at 2021-04-02 18:00:11 UTC
2021-04-02 18:00:56.909 UTC [52] LOG: database system is ready to accept connections
2021-04-02 18:03:23.275 UTC [343] discourse@discourse LOG: duration: 172.267 ms statement: UPDATE "stylesheet_cache"
           SET "content" = REPLACE("content", '/uploads', '/../uploads'), "digest" = REPLACE("digest", '/uploads', '/../uploads'), "source_map" = REPLACE("source_map", '/uploads', '/../uploads'), "target" = REPLACE("target", '/uploads', '/../uploads')
         WHERE "content" IS NOT NULL AND "content" LIKE '%/uploads%' OR "digest" IS NOT NULL AND "digest" LIKE '%/uploads%' OR "source_map" IS NOT NULL AND "source_map" LIKE '%/uploads%' OR "target" IS NOT NULL AND "target" LIKE '%/uploads%'

2021-04-02 18:03:55.952 UTC [52] LOG: received smart shutdown request
2021-04-02 18:03:57.185 UTC [52] LOG: background worker "logical replication launcher" (PID 79) exited with exit code 1
2021-04-02 18:03:57.189 UTC [74] LOG: shutting down
2021-04-02 18:03:57.308 UTC [52] LOG: database system is shut down
2021-04-02 18:04:00.354 UTC [47] LOG: starting PostgreSQL 13.2 (Debian 13.2-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
2021-04-02 18:04:00.355 UTC [47] LOG: listening on IPv4 address "0.0.0.0", port 5432
2021-04-02 18:04:00.356 UTC [47] LOG: listening on IPv6 address "::", port 5432
2021-04-02 18:04:00.359 UTC [47] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2021-04-02 18:04:00.375 UTC [66] LOG: database system was shut down at 2021-04-02 18:03:57 UTC
2021-04-02 18:04:00.380 UTC [47] LOG: database system is ready to accept connections
2021-04-02 18:13:27.137 UTC [47] LOG: received smart shutdown request
2021-04-02 18:13:27.980 UTC [47] LOG: background worker "logical replication launcher" (PID 72) exited with exit code 1
2021-04-02 18:13:27.982 UTC [67] LOG: shutting down
2021-04-02 18:13:28.009 UTC [47] LOG: database system is shut down
2021-04-02 18:13:31.497 UTC [45] LOG: starting PostgreSQL 13.2 (Debian 13.2-1.pgdg100+1) on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit
2021-04-02 18:13:31.499 UTC [45] LOG: listening on IPv4 address "0.0.0.0", port 5432
2021-04-02 18:13:31.499 UTC [45] LOG: listening on IPv6 address "::", port 5432
2021-04-02 18:13:31.500 UTC [45] LOG: listening on Unix socket "/var/run/postgresql/.s.PGSQL.5432"
2021-04-02 18:13:31.515 UTC [67] LOG: database system was shut down at 2021-04-02 18:13:27 UTC
2021-04-02 18:13:31.520 UTC [45] LOG: database system is ready to accept connections

```

### Nginx error log

```
2021/04/02 18:01:06 [error] 69#69: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.17.0.1, server: _, request: "GET /ask/ HTTP/1.0", upstream: "http://127.0.0.1:3000/ask/", host: "localhost:1357"
2021/04/02 18:13:38 [error] 64#64: *1 connect() failed (111: Connection refused) while connecting to upstream, client: 172.17.0.1, server: _, request: "POST /ask/message-bus/c734a550b6e54923aff3e0c6fdf1b014/poll HTTP/1.0", upstream: "http://127.0.0.1:3000/ask/message-bus/c734a550b6e54923aff3e0c6fdf1b014/poll", host: "localhost:1357", referrer: "https://privitevps.ga/ask/latest"

```

**When do you need it done?**

ASAP

**What is your budget, in $ USD that you can offer for this task?**

Open to suggestions. Please **PM me** with your approach and estimate.

---

<div class="post-metadata">

### Author: ![system](https://sea3.discourse-cdn.com/meta/user_avatar/meta.discourse.org/system/32/443519_2.png) [@system](https://meta.discourse.org/u/system)
#### Post date: [May 2, 2021, 4:54pm UTC](https://meta.discourse.org/t/paid-install-discourse-in-subfolder-on-ubuntu-server/185274/2 "2021-05-02T16:54:37Z")

</div>

This topic was automatically closed 30 days after the last reply. New replies are no longer allowed.
