It's not possible using the usual methods of decomposition because they estimate seasonality using at least as many degrees of freedom as there are seasonal periods. As @useR has pointed out, you need at least two observations per seasonal period to be able to distinguish seasonality from noise.
However, if you are willing to assume that the seasonality is relatively smooth, then you can estimate it using fewer degrees of freedom. For example, you can approximate the seasonal pattern using Fourier terms with a few parameters.
df <- ts(c(
2735.869,2857.105,2725.971,2734.809,2761.314,2828.224,2830.284,2758.149,
2774.943,2782.801,2861.970,2878.688,3049.229,3029.340,3099.041,3071.151,
3075.576,3146.372,3005.671,3149.381), start=c(2016,8), frequency=12)
library(forecast)
library(ggplot2)
decompose_df <- tslm(df ~ trend + fourier(df, 2))
trend <- coef(decompose_df)[1] + coef(decompose_df)['trend']*seq_along(df)
components <- cbind(
data = df,
trend = trend,
season = df - trend - residuals(decompose_df),
remainder = residuals(decompose_df)
)
autoplot(components, facet=TRUE)

You can adjust the order of the Fourier terms as required. I've used 2 here. For monthly data, the maximum you can use is 6, but that will give a model with 13 degrees of freedom which is way too many with only 20 observations. If you don't know about Fourier terms for seasonality, see https://otexts.org/fpp2/useful-predictors.html#fourier-series.
Now we can remove the seasonal component to get the seasonally adjusted data.
adjust_df <- df - components[,'season']
autoplot(df, series="Data") + autolayer(adjust_df, series="Seasonally adjusted")
